Java classLoader那些事儿

1.java类加载的定义&过程

  • 1.定义
    将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
  • 2.类加载的过程
    image.png
  • 3.类编译的过程
    image.png
  • 4.类加载的各个阶段
    image.png

Class对象实际上是在堆区
验证的过程中包括:文件格式验证,元数据验证,字节码验证,符号引用验证
解析阶段:类或接口、字段、类方法、接口方法、方法类型、方法句柄、点限定符

clinit()方法:类构造器方法,class类构造器对静态变量,静态代码块进行初始化,https://blog.csdn.net/u013309870/article/details/72975536linit()方法:对象构造器方法

  • 5.类的初始化与销毁
    image.png

2.双亲委派模型要点讲解

  • 1.定义
    子类加载器收到的类加载请求,不会先去处理,而是先把请求委派给父类加载器处理,当父类加载器处理不了时再返回给子类加载器加载。
  • 2.加载流程
    image.png

这里的双亲严格说其实只有父类,没有母类,只是泛指双亲为父类,也不是指祖父类,容易混淆

  • 3.双亲委派相关的类
    image.png

说是双亲委派模型,但是在其实现过程中,其实是通过组合模式实现的.

3.违反双亲委派模型的特例

  • 1.类加载器和抽象类java.lang.ClassLoader比双亲委派模型出现的早,为满足用户自定义类加载器的稳定,需要调用子类的loadClass()方法。
  • 2.通过线程上下文类加载器(Thread Context ClassLoader)满足JNDI、JDBC、JCE、JAXB和JBI相关服务的类加载需求。
  • 3.为追求程序动态可用而实现代码热替换、模块热部署。将目标程序模块和其类加载器等通过自定义的类加载机制全部替换掉而不需要重启虚拟机,如OSGi的模块化热部署技术,Tomcat的JSP热替换功能。

4.Tomcat的类加载器

  • 1.类加载器的定义
    类加载器定义:虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
  • 2.tomcat的类加载模型
    image.png

上面画的是tomcat 5,6版本的类加载模型,其中C,D可以有多个。

  • 3.tomcat的类加载结构
    image.png

5.自定义类加载

  • 1.类加载过程使用的核心方法和自定义的过程
    image.png

6.总结

1.JVM类加载的优点或者作用

  • 大多数网络应用框架底层都会用到
  • 帮助解决类加载相关的问题
  • 是编写架构底层服务的基础
  • 帮助编写更好的应用程序
  • 代码加密,服务隔离,热加载
  • 从指定的地方加载类,如磁盘或者网络

JVM类加载机制

  • 全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。
  • 父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
  • 缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效。
  • 每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。
  • 在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识,不同类加载器加载的类将被置于不同的命名空间。
  • 相关链接
    https://www.cnblogs.com/ityouknow/p/5603287.html
    参考深《深入理解Java虚拟机》
    https://blog.csdn.net/sunxianghuang/article/details/52067892
    http://www.imooc.com/article/257848?blockid=tuijianwz
    JIT代码生成器:https://baike.baidu.com/item/JIT编译器/3793585?fr=aladdin
    即时编译(JIT)即时编译器(JIT compiler,just-in-time compiler)
    https://juejin.im/post/5c890f21f265da2d993dc692
    https://juejin.im/post/5c890f996fb9a049a712ad20
    https://www.cnblogs.com/linghu-java/p/8589843.html
    https://www.cnblogs.com/wxd0108/p/6681618.html
    https://www.cnblogs.com/aspirant/p/8991830.html
    https://www.cnblogs.com/zyzdisciple/p/10100018.html
    https://blog.csdn.net/u013412772/article/details/80837735
    https://blog.csdn.net/dreamcatcher1314/article/details/78271251
    https://blog.csdn.net/uniquewonderq/article/details/79997878
    https://www.cnblogs.com/KingIceMou/p/7208336.html

架构设计@工程设计@服务稳定性之路

发布了159 篇原创文章 · 获赞 69 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/u010504064/article/details/103433390
今日推荐