美文网首页
Java虚拟机内存模型

Java虚拟机内存模型

作者: 纳米君 | 来源:发表于2018-09-27 00:21 被阅读222次

    参考书籍:《深入理解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虚拟机内存模型

          本文链接:https://www.haomeiwen.com/subject/tsbjbftx.html