2. JVM 运行机制

2.1. 1、启动流程

../../../_images/jvm-run-start.png

2.2. 2、JVM基本结构

../../../_images/jvm-struct.png

../../../_images/java-struct.png

2.2.1. 2 .1、PC寄存器

  • 每个线程拥有一个PC寄存器

  • 在线程创建时创建

  • 指向下一条指令的地址

  • 执行本地方法时,PC的值为undefine

2.2.2. 2 .2、 方法区

  • 保存装载的类信息:

    • 类型的常量池

    • 字段、方法信息

    • 方法字节码

  • 通常和永久区(Perm)关联在一起

2.2.3. 2.3、Java堆

  • 和程序开发密切相关

  • 应用系统对象都保存在Java堆中

  • 所有线程共享Java堆

  • 对分代GC来说,堆也是分代的

  • GC的主要工作区间

2.2.4. 2.4 、Java栈

  • 线程私有

  • 栈由一系列帧组成(因此Java栈也叫Java帧栈)

  • 帧保存一个方法的局部变量、操作数帧、常量池指针

  • 每一次方法调用创建一个帧,并压栈

2.2.5. 2.4 、栈、堆、方法区交互

public class AppMain {
    //运行时, jvm 把appmain的信息都放入方法区 

    //main 方法本身放入方法区。
    public static void main(String[] args) {
        //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面 

        Sample test1 = new Sample(" 测试1 ");
        Sample test2 = new Sample(" 测试2 ");
        test1.printName();
        test2.printName();
    }
}
//运行时, jvm 把appmain的信息都放入方法区 
class Sample{
    private String name;

    //new Sample实例后, name 引用放入栈区里,  name 对象放入堆里 
    public Sample(String name) {
        this.name = name;
    }
    //print方法本身放入方法区里。
    public void printName() { System.out.println(name);
    }
}

../../../_images/jvm-stack-help.png