一、JVM简述
- 个人对JVM的理解:是一个专门运行Java程序的小型操作系统,随着程序的启动而启动,结束而结束
- JVM的组成:
- 线程共享的区域:
- 方法区:存放instanceKlass元数据、常量、静态变量
- 堆:存放对象,包括:对象头、元数据指针、实例数据
- 线程独享的区域:
- 栈:存放方法的局部变量表、操作数栈、动态链接、方法出口
- 线程共享的区域:
二、JVM加载对象举例
- 举例代码:
A a=new A();
public Class A{
public int x;
public B b;
public static int y;
public string s;
public void test(){
int i=1;
i++;
C c=new C();
}
}
- 具体步骤:
-
main方法放入线程栈帧,加载类A
- 在方法区中生成A的instanceKlass,表示其元数据,里面存放A的类型信息、常量、字段信息、方法信息、静态变量、静态链接
- 并在堆中创建对应的instanceOopDesc来表示java.lang.Class对象,里面存放A类的镜像Class对象,包括对象头、元数据指针、实例数据
- 在堆的Class对象中初始化静态变量
- 在堆中生成对象a,并作为局部变量表中a的引用
-
上述过程中会加载类B,过程与加载类A一样
-
test方法加载到线程栈帧中,并执行:
- 局部变量表给局部变量赋值,操作数栈中操作 ++ 操作
- 加载类C,过程与加载类A一样
- 在堆中生出对象c,作为局部变量表中c的引用,即为动态链接
-
- 图例解释: