Java虚拟机模型

参考书籍:《深入理解Java虚拟机》

JVM模型分为5个运行时数据区域:

image.png
1. 程序计数器:

当前线程所执行的字节码的行号指示器,线程私有

2. 本地方法栈:

执行native方法,线程私有

3. Java虚拟机栈:

执行Java方法,线程私有。先进后出原则。
执行方法时,都会先创建一个栈帧,并在Java虚拟机栈中入栈,方法执行完,栈帧出栈。
比如:初学者都会遇到方法内部改了传进来的变量值,而方法执行完后,变量的值却不变的题目,这就涉及到栈的原理了。

示例代码:

public class Test {

    public static void main(String[] args) throws InterruptedException {
        int i = 20;
        test(i);
        System.out.println(i);// 20
    }

    public static void test(int i) {
        i = 10;
    }
}

i 的值依旧为20。

  1. 用文字来解释:Java方法传基本类型的值传的是值的拷贝(PS:传对象引用也是传的引用拷贝,但是最终指向堆中的同一个对象),既然是值的拷贝,当然不影响原来的值。
  2. 用流程图来解释执行过程:
image.png
4. 堆:

new的对象都存储在堆内存中,线程共享

5. 方法区:

存储Class字节码信息、final常量、静态变量等,线程共享运行时常量池是方法区的一部分,主要用来存储编译器生成的字面常量,比如字符串。
比较典型的是String类的intern()方法,如果常量池中已存在就直接返回,反之,创建新字符串存放到常量池再返回该字符串。

示例代码:

String var = new String("233");
String intern = var.intern();
System.out.println(var == intern);//false
简图.png

变量var指向堆,intern指向方法区的常量池,两者分配的内存地址不同,==比较结果当然是false。

上述5个运行时数据区域,主要需要清楚Java虚拟机栈、堆、方法区这3个。

你可能感兴趣的:(Java虚拟机模型)