《深入理解JAVA虚拟机 3》
JVM内存结构主要包括以下几个部分:
一 Class Loader System(类加载子系统)
Loading(加载)
1.通过一个类的全限定名来获取定义此类的二进制字节流;
2.将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构。
3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
Linking(链接)
包括三部分:验证 准备 解析
验证:确保CLass文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全,包括文件格式验证,元数据验证,字节码验证,符号引用验证;
准备:正式为类变量分配内存并且设置类变量初始值阶段,这些变量的内存都将在方法区进行分配,注意一点:这里做内存分配的类变量(static 修饰的变量),胃不适包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆里面,这里所说的初始值是通常是数据类型的零值,加入一个类中有定义如下:public static int a = 12; 那么,在这里准备阶段的初始值不是12而是0但是,如果是public static final int a = 12; 那么这里就会初始化12;
解析:虚拟机将常量池内的符号引用替换成直接引用的过程。
Initialization(初始化)
到了初始化阶段,才真正开始执行类中定义的java程序代码(或者说字节码)。
在准备阶段,变量已经赋过一次系统要求的初始化值,在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。