JVM类加载机制

当我们运行某个类的main函数时,首先需要通过类加载器将主类加载到JVM中去。

类加载过程

加载

在硬盘上找到对应的.class文件,并且通过IO 读入

验证

校验字节码文件的正确性

准备

给类的静态变量分配内存,并赋予默认值

解析

将符号引用替换为直接引用,该阶段会把一些静态方法(静态方法,例如main()方法,替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换成直接引用)

符号引用&直接引用

在类的加载过程中的解析阶段,Java虚拟机会把类的二进制数据中的符号引用 替换为 直接引用,如Worker类中一个方法:

public void gotoWork(){car.run(); //这段代码在Worker类中的二进制表示为符号引用
}

在Worker类的二进制数据中,包含了一个对Car类的run()方法的符号引用,它由run()方法的全名 和 相关描述符组成。在解析阶段,Java虚拟机会把这个符号引用替换为一个指针,该指针指向Car类的run()方法在方法区的内存位置,这个指针就是直接引用。

初始化

对类的静态变量初始化为指定的值,执行静态代码块

使用

卸载

类加载器

启动类加载器

是由C++实现的,这个类加载器负责放在<JAVA_HOME>\jre\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库。用户无法直接使用。

扩展类加载器

这个类加载器由sun.misc.Launcher$AppClassLoader实现。它负责<JAVA_HOME>\jre\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。用户可以直接使用。

应用程序类加载器

这个类由sun.misc.Launcher$AppClassLoader实现。是ClassLoader中getSystemClassLoader()方法的返回值。它负责用户路径(ClassPath)所指定的类库。用户可以直接使用。如果用户没有自己定义类加载器,默认使用这个。

自定义加载器

用户自己定义的类加载器。

双亲委派机制

当需要加载一个类的时候首先是找到应用类加载器去加载,应用类加载器会向上委托给扩展类加载器,扩展类向上委托给启动类加载器,启动类加载器在核心类库中(<JAVA_HOME>\jre\lib)找不到该类时,会让扩展类自己加载,扩展类加载器(<JAVA_HOME>\jre\lib\ext)也没找到该类时就会让应用类加载器自己到(classpath)加载,这就是双亲委派机制。如下图示意:

接下来我们看看源码的实现,由于ExtClassLoader中没有覆写loadClass()方法,而AppClassLoader的loadClass()方法最终是指向ClassLoader类中的loadClass()这个方法,所以我们直接看ClassLoader中的代码

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loaded//先检查一下该类有没有被加载过,如果已经被加载了就会直接找到并返回Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {// 如果父类不为空,调用parent(该parent不是通过extend来的父类,而是在Launcher类中指定的)// 的loadClassc = parent.loadClass(name, false);} else {// 由于BootstrapClassLoader是C++实现的,所以ExtClassLoader的parent赋值是nullc = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.// 如果上面的classLoader都没找到就自己找long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}

双亲委派机制的作用

1.防止核心类库被修改

2.避免类的重复加载

JVM类加载机制及源码分析相关推荐

  1. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  2. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  3. 以太坊POA共识机制Clique源码分析

    以太坊中除了基于运算能力的POW(Ethash)外,还有基于权利证明的POA共识机制,Clique是以太坊的POA共识算法的实现,这里主要对POA的Clique相关源码做一个解读分析. Clique的 ...

  4. Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    1  背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>, 然后有人在文章下面评论和微博 ...

  5. (转) Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    转载[工匠若水 http://blog.csdn.net/yanbober ] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与Layou ...

  6. View事件分发机制(源码分析篇)

    01.Android中事件分发顺序 1.1 事件分发的对象是谁 事件分发的对象是事件.注意,事件分发是向下传递的,也就是父到子的顺序. 当用户触摸屏幕时(View或ViewGroup派生的控件),将产 ...

  7. Apache Storm 实时流处理系统ACK机制以及源码分析

    1.ACK机制简介 Storm的可靠性是指Storm会告知用户每一个消息单元是否在一个指定的时间(timeout)内被完全处理.完全处理的意思是该MessageId绑定的源Tuple以及由该源Tupl ...

  8. 以太坊POA共识机制Clique源码分析 1

    转载自Ryan是菜鸟 | LNMP技术栈笔记 以太坊中除了基于运算能力的POW(Ethash)外,还有基于权利证明的POA共识机制,Clique是以太坊的POA共识算法的实现,这里主要对POA的Cli ...

  9. Handler机制的源码分析

    2019独角兽企业重金招聘Python工程师标准>>> Handler,MessageQueue,Looper的关系 Looper的作用是在线程中处理消息的 MessageQueue ...

最新文章

  1. datanucleus mysql_DataNucleus Access Platform 3.1.2发布
  2. 记事本 换行符_30年后终更新!新一代Win10记事本详细体验
  3. VTK:PolyData之SurfacePointPlacer
  4. 你这飞机会爆炸吗?航空公司含泪甩卖49元机票,却被超模君挖出秘密!
  5. 心动的本质是什么_那一刻,我怦然心动了......
  6. oracle 添加归档日志文件_oracle 归档日志文件路径设置
  7. java中使用tika_Tika基本使用
  8. javascript实现常用的设计模式
  9. 油管歌曲视频下载 视频转MP3
  10. Ubuntu安装NVDIA显卡驱动,CUDA及cuDNN
  11. Nginx实现白名单灰度发布,杜绝后台不可操控
  12. 实现jquery双击图片放大
  13. 宏转录组测序数据菌株层面的分析软件总结
  14. AI 人工智能 探索 (九)
  15. CoreData 的使用
  16. 把牌分成两堆,让每堆面朝上的牌数目相同
  17. 数字乡村数据库:农村农业数字化指标、县域数字乡村指数、中国电子商务报告等四大维度数据
  18. 怎么从微信群聊中引流?如何从群聊进行引流?微信群怎么引流
  19. 解决Access denied for user ''@'localhost' to database 'mysql
  20. 一对多的临近服务直接通信

热门文章

  1. 3DMaxy有什么步骤设置模型投影
  2. GET 和 POST安全性比较与讨论
  3. 活动推荐 | 2022年深圳最值得参加的边缘计算活动
  4. Ubuntu重启后没有图形界面
  5. php md5加密(并小写),PHP常见加密函数用法示例【crypt与md5】
  6. 2021-06-26 JAVA开发岗-民生银行笔试算法题
  7. WIN10 DOS命令设置WIFI 连接
  8. MaskedTextBox中对IP信息输入的处理
  9. ORACLE EXECUTE IMMEDIATE 用法
  10. Android 面试题 200 道 :全面解析