Java虚拟机--一段Java程序的生命史(四)

  • 来源:
  • 更新日期:2018-05-23

摘要:方法区与堆一样都是线程共享的内存区域它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。而运行时常量池是方法区的一部分它主要用于存放编译期声明各种字面量和符号引用。

 方法区与堆一样都是线程共享的内存区域它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。而运行时常量池是方法区的一部分它主要用于存放编译期声明各种字面量和符号引用。

直接内存
直接内存并不是虚拟机运行时数据区的一部分也是不Java规范中定义的内存区域你可以简单理解为堆外内,内存分配不受Java堆大小的限制但受整个内存大小的限制。
30_10_40_23_444.jpg
类加载的流程
加载、验证、准备、解析、初始化五步其中加载、验证、准备、初始化是顺序执行的而解析则不一定它有可能会在初始化之后执行。
加载
在加载阶段JVM需要完成三个步骤:首先通过类的全限定名来获取定义此类的二进制字节流然后将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,最后在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各种数据入口。在第一步获取二进制字节流中并没有明确的指出从一个*.class文件中获取规定的灵活性导致我们可以从ZIP、从数据库获取。
验证
验证其实就是为了确保Class文件字节流中包含信息符合JVM的要求因为Class文件的来源途径不一定中规中矩的从编译器产生,也可能用十六进制编辑器直接编写Class文件校验流程为文件格式校验、元数据验证、字节码验证这地方的具体安全校验方式不再细说。