1:HotSpot虚拟机中并不区分虚拟机栈和本地方法栈
而且方法区:永久代(内存管理使用永久代来实现方法区)
类加载过程:
加载、验证、准备、解析、初始化
与那些在编译时需要进行连接工作的语言不同,在Java语言里面,
类型的加载,连接和初始化过程都是在程序运行期间完成的。
加载: 完成三件事
1:通过一个类全限定名来获取定义此类的二进制字节流
2:将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3:在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证
准备
类经过一系列的验证加载到方法区,准备阶段正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中。
这个阶段中有两个容易产生混淆的概念需要强调一下,首先,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将
会在对象实例化时随着对象一起分配在Java堆中,其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:
public static int value = 123;
那变量value在准备阶段过后的初始值为0而不是123,因为这时候尚未开始执行任何Java方法,而把value赋值为123的动作是在初始化阶段 才会执行。
假如是 public static final int value =123;那么在准备阶段就会将value赋值为123
解析:
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
初始化:
类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导
和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。
在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。