代码拉取完成,页面将自动刷新
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="VuePress 2.0.0-beta.27">
<link rel="icon" href="https://avatars.githubusercontent.com/u/43716716?s=200&v=4"><title>类加载器 | JVM 底层原理最全知识总结</title><meta name="description" content="Doocs开源社区">
<link rel="preload" href="/jvm/assets/js/runtime~app.26a29375.js" as="script"><link rel="preload" href="/jvm/assets/css/styles.94043d91.css" as="style"><link rel="preload" href="/jvm/assets/js/567.d52b7511.js" as="script"><link rel="preload" href="/jvm/assets/js/app.545f3cc1.js" as="script">
<link rel="stylesheet" href="/jvm/assets/css/styles.94043d91.css">
</head>
<body>
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/jvm/" class=""><!----><span class="site-name can-hide">JVM 底层原理最全知识总结</span></a></span><div class="navbar-links-wrapper" style=""><!--[--><!--]--><nav class="navbar-links can-hide"><!--[--><div class="navbar-links-item"><a class="nav-link external" href="https://github.com/doocs/jvm" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button class="toggle-dark-button" title="toggle dark mode"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-links"><!--[--><div class="navbar-links-item"><a class="nav-link external" href="https://github.com/doocs/jvm" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-links"><!--[--><!--[--><p class="sidebar-heading sidebar-item active">指南</p><ul class=""><li><!--[--><a href="/jvm/00-quickstart.html" class="nav-link sidebar-item" aria-label="开始学习"><!--[--><!--]--> 开始学习 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/01-jvm-memory-structure.html" class="nav-link sidebar-item" aria-label="JVM 内存结构"><!--[--><!--]--> JVM 内存结构 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/02-hotspot-jvm-object.html" class="nav-link sidebar-item" aria-label="HotSpot 虚拟机对象探秘"><!--[--><!--]--> HotSpot 虚拟机对象探秘 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/03-gc-algorithms.html" class="nav-link sidebar-item" aria-label="垃圾收集策略与算法"><!--[--><!--]--> 垃圾收集策略与算法 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/04-hotspot-gc.html" class="nav-link sidebar-item" aria-label="HotSpot 垃圾收集器"><!--[--><!--]--> HotSpot 垃圾收集器 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/05-memory-allocation-gc.html" class="nav-link sidebar-item" aria-label="内存分配与回收策略"><!--[--><!--]--> 内存分配与回收策略 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/06-jvm-performance-tuning.html" class="nav-link sidebar-item" aria-label="JVM 性能调优"><!--[--><!--]--> JVM 性能调优 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/07-class-structure.html" class="nav-link sidebar-item" aria-label="类文件结构"><!--[--><!--]--> 类文件结构 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/08-load-class-time.html" class="nav-link sidebar-item" aria-label="类加载的时机"><!--[--><!--]--> 类加载的时机 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/09-load-class-process.html" class="nav-link sidebar-item" aria-label="类加载的过程"><!--[--><!--]--> 类加载的过程 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html" class="router-link-active router-link-exact-active nav-link router-link-active sidebar-item active" aria-label="类加载器"><!--[--><!--]--> 类加载器 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#类与类加载器" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="类与类加载器"><!--[--><!--]--> 类与类加载器 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#判断类是否-相等" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="判断类是否“相等”"><!--[--><!--]--> 判断类是否“相等” <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#加载器种类" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="加载器种类"><!--[--><!--]--> 加载器种类 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#双亲委派模型" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="双亲委派模型"><!--[--><!--]--> 双亲委派模型 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#什么是双亲委派模型" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="什么是双亲委派模型"><!--[--><!--]--> 什么是双亲委派模型 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#工作过程" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="工作过程"><!--[--><!--]--> 工作过程 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/10-class-loader.html#为什么使用双亲委派模型" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="为什么使用双亲委派模型"><!--[--><!--]--> 为什么使用双亲委派模型 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li></ul><!--]--></li></ul><!--]--><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><h1 id="类加载器" tabindex="-1"><a class="header-anchor" href="#类加载器" aria-hidden="true">#</a> 类加载器</h1><h2 id="类与类加载器" tabindex="-1"><a class="header-anchor" href="#类与类加载器" aria-hidden="true">#</a> 类与类加载器</h2><h3 id="判断类是否-相等" tabindex="-1"><a class="header-anchor" href="#判断类是否-相等" aria-hidden="true">#</a> 判断类是否“相等”</h3><p>任意一个类,都由<strong>加载它的类加载器</strong>和这个<strong>类本身</strong>一同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都有一个独立的类名称空间。</p><p>因此,比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。</p><p>这里的“相等”,包括代表类的 Class 对象的 <code>equals()</code> 方法、<code>isInstance()</code> 方法的返回结果,也包括使用 instanceof 关键字做对象所属关系判定等情况。</p><h3 id="加载器种类" tabindex="-1"><a class="header-anchor" href="#加载器种类" aria-hidden="true">#</a> 加载器种类</h3><p>系统提供了 3 种类加载器:</p><ul><li>启动类加载器(Bootstrap ClassLoader): 负责将存放在 <code><JAVA_HOME>\lib</code> 目录中的,并且能被虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。</li><li>扩展类加载器(Extension ClassLoader): 负责加载 <code><JAVA_HOME>\lib\ext</code> 目录中的所有类库,开发者可以直接使用扩展类加载器。</li><li>应用程序类加载器(Application ClassLoader): 由于这个类加载器是 ClassLoader 中的 <code>getSystemClassLoader()</code> 方法的返回值,所以一般也称它为“系统类加载器”。它负责加载用户类路径(classpath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/doocs/jvm@main/images/classloader.png" alt="ClassLoader"></p><p>当然,如果有必要,还可以加入自己定义的类加载器。</p><h2 id="双亲委派模型" tabindex="-1"><a class="header-anchor" href="#双亲委派模型" aria-hidden="true">#</a> 双亲委派模型</h2><h3 id="什么是双亲委派模型" tabindex="-1"><a class="header-anchor" href="#什么是双亲委派模型" aria-hidden="true">#</a> 什么是双亲委派模型</h3><p>双亲委派模型是描述类加载器之间的层次关系。它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。(父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器的代码)</p><h3 id="工作过程" tabindex="-1"><a class="header-anchor" href="#工作过程" aria-hidden="true">#</a> 工作过程</h3><p>如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(找不到所需的类)时,子加载器才会尝试自己去加载。</p><p>在 java.lang.ClassLoader 中的 <code>loadClass</code> 方法中实现该过程。</p><h3 id="为什么使用双亲委派模型" tabindex="-1"><a class="header-anchor" href="#为什么使用双亲委派模型" aria-hidden="true">#</a> 为什么使用双亲委派模型</h3><p>像 java.lang.Object 这些存放在 rt.jar 中的类,无论使用哪个类加载器加载,最终都会委派给最顶端的启动类加载器加载,从而使得不同加载器加载的 Object 类都是同一个。</p><p>相反,如果没有使用双亲委派模型,由各个类加载器自行去加载的话,如果用户自己编写了一个称为 java.lang.Object 的类,并放在 classpath 下,那么系统将会出现多个不同的 Object 类,Java 类型体系中最基础的行为也就无法保证。</p><!--]--></div><footer class="page-meta"><div class="meta-item edit-link"><a class="nav-link external meta-item-label" href="https://github.com/doocs/jvm/edit/main/docs/10-class-loader.md" rel="noopener noreferrer" target="_blank" aria-label="编辑"><!--[--><!--]--> 编辑 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><div class="meta-item last-updated"><span class="meta-item-label">最近更新时间: </span><span class="meta-item-info">2021/6/17 上午1:05:16</span></div><div class="meta-item contributors"><span class="meta-item-label">贡献者: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: szuyanglb@outlook.com">yanglbme</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: yanglbme@users.noreply.github.com">yanglbme</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav"><p class="inner"><span class="prev"> ← <a href="/jvm/09-load-class-process.html" class="nav-link" aria-label="类加载的过程"><!--[--><!--]--> 类加载的过程 <!--[--><!--]--></a></span><!----></p></nav><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
<script src="/jvm/assets/js/runtime~app.26a29375.js" defer></script><script src="/jvm/assets/js/567.d52b7511.js" defer></script><script src="/jvm/assets/js/app.545f3cc1.js" defer></script>
</body>
</html>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。