JVM基础-类加载过程


类加载过程

  • 加载
  • 验证
  • 准备:为变量分配空间,赋零值
  • 解析:符号引用转为直接引用
  • 初始化:执行 static 的内容,为变量赋程序定义的初始值
  • 使用
  • 销毁

若URLClassLoader加载的jar中,有内部一类的jar,且一起打包在一起了,则无法直接加载,可以通过使用!/ 的方式,将内部的文件读取出来,写到本地,在通过file文件文件流,再次手动加载,且不能在使用过程中关闭,否则,可能报找不到类

参考:https://blog.csdn.net/feinifi/article/details/130165703

https://blog.csdn.net/a18602320276/article/details/129925935

双亲委派模型

  • 【BootStrap】启动 类加载器
  • 【Extension】扩展 类加载器
  • 【Application】应用程序 类加载器
  • 【User】自定义 类加载器

自底向上 检测类是否被加载

  • 已被加载,则直接返回类对象
  • 未被加载,则委派父类加载器加载(父类未加载,则向上循环)

双亲委派机制【优点】

  • (1) 避免类的重复加载
  • (2) 类加载器 加载 自己管理【范围】内的类

如何打破

自定义类加载器:

重点:

  • 1、继承URLClassLoader,parent设置为null
  • 2、在调用方法的时候,设置Thread.getClassLoader = 自定义的classloader,调用完毕后,在恢复

避免目标类中的第三方依赖不隔离
如使用Thread.currentThread.getContextClassLoader()

实际应用场景

热部署

热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为

方法

创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署。

热部署步骤:

  • 1、销毁自定义classloader(被该加载器加载的class也会自动卸载);
  • 2、更新class
  • 3、使用新的ClassLoader去加载class

参考

1、https://www.cnblogs.com/aspirant/p/7200523.html


文章作者: 王利康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王利康 !
 上一篇
JVM-垃圾回收 JVM-垃圾回收
这是你自定义的文章摘要内容,如果这个属性有值,文章卡片摘要就显示这段文字,否则程序会自动截取文章的部分内容作为摘要
2024-08-31
下一篇 
JVM/JVM-元空间 JVM/JVM-元空间
这是你自定义的文章摘要内容,如果这个属性有值,文章卡片摘要就显示这段文字,否则程序会自动截取文章的部分内容作为摘要
2024-08-31
  目录