我们都知道JVM虚拟机的可执行文件为.class文件,那么什么时候JVM虚拟机会加载自己所需要的类呢?之前自己一直有这样的问题,上网找过好多网友的解释,感觉好像理解但是自己却无法说清楚,今天看了《深入理解JVM虚拟机》一书的讲解感觉自己有些透了,在此记录下来自己的理解~!
绘图1.png
类的主动引用(一定会发生类的初始化)
类的被动引用(不会发生类的初始化)
是否符合JVM规范,没有安全问题。大致分为四个阶段:文件格式验证、元数据验证、字节码验证、符号引用验证
为类变量(仅包括被static修饰的变量)分配内容并设置类变量初始值的阶段,这些变量所使用的内存都将在方法去中进行分配。
解析阶段是虚拟机将常量池的符号引用替换为直接引用的过程。(A.a = "Hello"替换为A.a指向“Hello”的地址)
初始化阶段时执行类构造器<clinit>()方法的过程,<clinit>()方法是由变一起自动手机类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。
//详情请见代码
在Java虚拟机中类的生命周期和对象的生命周期很相似。虚拟机创建并初始化对象,使程序使用对象,然后在对象变得不再被引用后可选地进行垃圾收集。同样,虚拟机装载、连接并且初始化类,使程序能使用类,当程序不再引用他们的时候可选的卸载它们。如果程序不再引用某类型,那么这个类型就变成不可触及,所以可以被垃圾收集(俗称GC)。但需要注意的是JVM自带的类加载器(PS:Bootstrap、ExtClassLoader、AppClassLoader)装载的类型永远是可触及的,所以永远不会被卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及的,从而被虚拟机回收。