深入理解ClassLoader
深入理解ClassLoader
ClassLoader 作用
- 负责将 Class 加载到 JVM 中
- ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回 这个类的class对象。
- 审查每个类由谁加载(父优先的等级加载机制)
- 将 Class 字节码重新解析成 JVM 统一要求的对象格式
类加载时机与过程
- 类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)
类的实例化与类的初始化
- 类的实例化是指创建一个类的实例(对象)的过程;
- 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。
什么情况下需要开始类加载过程的第一个阶段:”加载”。
- 虚拟机规范中并没强行约束,这点可以交给虚拟机的的具体实现自由把握,但是对于初始化阶段虚拟机规范是严格规定了如下几种情况,如果类未初始化会对类进行初始化:
- 创建类的实例
- 对类进行反射调用的时候,如果累没有进行过初始化,则需要先触发其初始化
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
- 当虚拟机启动时,用户需要指定一个要执行的主类(包含main 方法的那个类),虚拟机会先初始化这个主类
- 当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。
双亲委托模型
- JVM 在运行时会产生三个ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和 App ClassLoader。
- Bootstrap ClassLoader是用C++编写的,在Java中看不到它,是null。它用来加载核 心类库,就是在lib下的类库,
- Extension ClassLoader加载lib/ext下的类库,
- App ClassLoader加载 Classpath里的类库,
- 三者的关系为:App ClassLoader的Parent是Extension ClassLoader,而 Extension ClassLoader的Parent为Bootstrap ClassLoader。
- 所有系统中的ClassLoader组成一棵树,ClassLoader在载入类库时先让Parent寻找,Parent找不到才自己找。
- 加载一个类时,首先BootStrap进行寻 找,找不到再由Extension ClassLoader寻找,最后才是App ClassLoader。
- 将 ClassLoader设计成委托模型的一个重要原因是出于安全考虑,比如在Applet中,如果编写了一个java.lang.String类并具有破 坏性。
假如不采用这种委托机制,就会将这个具有破坏性的String加载到了用户机器上,导致破坏用户安全。
线 程中的ClassLoader
- 每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
Web应用中的ClassLoader
- 回到上面的例子,在Tomcat 里,WebApp的ClassLoader的工作原理有点不同,它先试图自己载入类(在ContextPath/WEB-INF/...中载入类),如果 无法载入,再请求父ClassLoader完成。
- 对于WEB APP线程,它的contextClassLoader是WebAppClassLoader
对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader
获得ClassLoader的几种方法
- 可以通过如下3种方法得到ClassLoader
this.getClass.getClassLoader(); // 使用当前类的ClassLoader
Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader
ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。
(注意,system ClassLoader与根 ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)
参考
深入理解ClassLoader的更多相关文章
- (转)理解classloader
ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见.理解ClassLoader的加载机制,也有利于我们编写出更高效的代码.ClassLo ...
- 理解ClassLoader工作机制
package com.ioc; public class Test { public static void main(String[] args) throws ClassNotFoundExce ...
- 深入理解ClassLoader(五)—类的卸载
原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101413730764/?suggestedreading&wumi ...
- 深入理解ClassLoader工作机制(jdk1.8)
ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中 审查每个类由谁加载(父优先的等级加载机制) 将 Class 字节码重新 ...
- 一个例子深入理解ClassLoader
文件类加载器,该加载器重载了loadClass方法,逻辑是只读取文件来加载类,不委托给父类加载器进行加载 package com.ydd.study.hello.classloader; import ...
- 理解ClassLoader基本原理
当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader | exte ...
- 深入理解ClassLoader(四)—类的父委托加载机制
上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系.
- 理解ClassLoader
--摘自<Android进阶解密> *Java中的ClassLoader* 1.系统类加载器包括3种: 1)Bootstrap ClassLoader(引导类加载器) C/C++代码实现的 ...
- ClassLoader简单介绍
要理解ClassLoader,我们可以通过what.how两个方面来解释 一.what:什么事ClassLoader? 1.ClassLoader可以是将class文件加载到JVM方法区. 2.Cla ...
随机推荐
- JMeter FTP测试计划
为了演示测试目的,我们将使用公共可用的FTP位置,可以使用它来测试文件的下载. 您可以使用市场上现有的任何可用的演示FTP位置.我们使用URL下的FTP位置: https://dlptest.com/ ...
- linux c函数参考手册
一.字符测试 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ascii码字符) isblank(测试字符是否为空格字符) is ...
- 前端——BOM与DOM
目录 前戏 window对象 window的子对象 navigator对象(了解即可) screen对象(了解即可) history对象(了解即可) location对象 弹出框 计时相关 DOM H ...
- eclipse中如何配置tomcat
1.打开eclipse上面的Windows选项,选择Preferences==>Server==>Runtime Environments==>Add 2.选择你电脑中安装的tomc ...
- ELK学习实验012:Logstash的安装和使用
一 logstash安装 1.1下载包 [root@node1 ~]# cd /usr/local/src/ [root@node1 src]# wget https://artifacts.elas ...
- 015 Ceph的集群管理_1
一.理解Cluster Map cluster map由monitor维护,用于跟踪ceph集群状态 当client启动时,会连接monitor获取cluster map副本,发现所有其他组件的位置, ...
- dp-最长回文串
博客 : http://blog.csdn.net/hao_zong_yin/article/details/72730732 问题描述: 求一个序列中的最长回文串,这个串可以不连续 , 如 { 1 ...
- Centos 7.2 Jenkins+Ansible+Gitlab 基础配置
注意:首先准备jenkins服务器 如何搭建jenkins 由于上篇文章中jenkins是采用war并部署在tomcat中来完成的安装,所以这里隆重介绍下启动tomcat的用户:tomcat,下面会 ...
- Oracle v_$和v$的解释
以v_$mystat和v$mystat具体说明 grant语句中使用的v_$mystat和test用户访问的v$mystat不一样 这里说一下 v$mystat 和 v_$mystat 的区别 初始状 ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...