深入了解JVM类加载机制

时间:2022-02-01 17:35:11

1.      为什么研究类加载的全过程:

a)        有助于了解JVM运行过程。

b)        更深入理解JAVA动态性,了解类加载。

2.      核心:类加载器,当要加载类时(分为三步):

1、  加载:把字节码加入到内存中。

字节码--->类加载器--->类。

把字节码加入到方法区,形成一个运行的二进制数据结构,在堆中生成一个class对象。

2、 链接:

1.         验证:符合JVM规范,是否有安全问题。

2.         准备:正式为我们加载的类分配内存并且赋初始值。

3.         解析:虚拟常量池中符号引用改为直接引用(给予直接地址或者相对地址)。

3、 初始化:

1.         实现类构造器:编译器自动的收集类中的静态变量或者静态块,并且进行构造。

2.         初始化一个类时会初始化父类。

3.         保证在多线程构造时加锁。

4.         当访问一个类的静态域时只有真正声明这个域的类才能初始化。

1)     被动引用和主动引用:

深入了解JVM类加载机制

2)     加载过程:

深入了解JVM类加载机制

        方法区、堆、栈,JVM加载类时,首先将类的信息加入到方法区中,JVM会自动收集类中的静态方法和静态块,在类加载过程JVM将类中相关方法变量加入到方法区。

一、          类加载器原理

                类缓存区,已加载的类会在堆中存在一段时间,之后会被JVM垃圾回收机制回收。

二、          JAVA.LANG.CLASS.LOADER

                     JAVA中类加载的核心包。

三、          类加载器树状机制、双亲加载机制

1.       引导类加载器(bootstr class loader):

                  加载JAVA的核心库,采用的是原生代码(C),并不是采用继承JAVAOBJECT类。

         除引导类加载器是用C源生类写的,其余都是继承的JAVAOBJECT包中。

1.       引导类加载器(bootstr class loader):

                  加载JAVA的核心库,采用的是原生代码(C),并不是采用继承JAVAOBJECT类。

         除引导类加载器是用C源生类写的,其余都是继承的JAVAOBJECT包中。

 

2.       扩展类加载器(extendsions classloader):

深入了解JVM类加载机制

双亲委托机制:

深入了解JVM类加载机制

3.       应用程序类加载器(applicatio class loader):

        根据用户给定的路径进行类的加载。

深入了解JVM类加载机制

一、          自定义类加载器(文件、网络、加密)

文件加密

    对需要加密的文件的字节进行处理。

实现思路:

    1、  读取需要加密的文件。

    2、  对读入数据进行操作。

    3、  输出到目标文件中。

可以自定义加密的类加载器。

a)        继承java.lang.ClassLoader

b)        首先检查请求的类型是否已经被这个类装载器装载到命名空间中。如果已经装载,直接返回。

c)        委派类加载请求给父类加载器,如果父类加载器能够完成,则返回父类加载器加载的Class实例。

d)        调用本类加载器的findClass()方法,导入类型的方法区;如果获取不到对应的字节码或者其他原因失败,返回异常loadClass(),loadClass()转抛异常,终止加载过程。

深入了解JVM类加载机制

二、          线程上下文类加载器

深入了解JVM类加载机制

三、          服务器类加载原理和OSGI介绍
深入了解JVM类加载机制