JVM虚拟机及类加载

一、JVM jdk1.8之前

structure.png

二、JVM JDK1.8

structure8.png

三、类加载及生命周期

虚拟机将类的描述文件class 文件加载到内存并进行安全校验、数据类型解析、内存分配以及初始化、最终形成可以被虚拟机直接使用的java类型,这个过程就是虚拟机的类加载机制。与解释执行的语言不同,java语言是编译型语言,类型的连接是在程序运行期进行的,可以动态加载一下内容,增加了灵活性。
java虚拟机规范里,没有强制规定类加载时机,需要具体虚拟机自由实现。但对初始化阶段有严格规定:

  • 遇到new、putstatic及invokestatic 4条指令代码是,如果没有初始化,立即进行初始化。
  • 使用reflect包的方法对类进行反射的时候,没有则进行初始化
  • 初始化类的时候,发现父类没有初始化
  • 虚拟机启动,需要启动主类初始化。
  • 使用动态语言时,如果java.lang.invoke.MethodHandle实例最终的解析结果是REF_getstatic、REF_putStatic、REF_invokeStatic句柄时且句柄没有初始化时。


    classLoad.png

加载

加载阶段虚拟机要完成三件事情

  • 根据类的全限定名获取定义此类的二进制字节流;
  • 将字节流代表的静态存储结构转换为方法去的运行是数据结构;
  • 在方法区中为这个类生成一个java.lang.CLass 对象,作为方法区这个类的访问入口

验证

持续时间最长的阶段,文件格式验证、元数据验证、字节码验证、符号引用验证。

准备

为类变量分配内存并设置初始化值(不是代码定义的值,final除外)的阶段,使用内存在方法区。

解析

将符号引用转化为直接引用的过程。

四、实例化

newInstance.png

你可能感兴趣的:(JVM虚拟机及类加载)