图解Java虚拟机内存模型

Posted 水田如雅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解Java虚拟机内存模型相关的知识,希望对你有一定的参考价值。

类装载子系统

负责将我们用到的文件,加载到JVM的运行时数据区

字节码执行引擎

  • 负责执行加载到方法区中的字节码
  • 在执行字节码的同时,修改对应线程的程序计数器,标记当前正在执行的代码

运行时数据区- 线程独享的部分

虚拟机栈

主要是存放调用方法时候用到的一些数据;

下面我们用一段简单代码来说明下:

 @Data
    public static class User implements Serializable 
        Integer id;
        String name;
    

    public static void main(String[] args) 
        int a = 1;
        int b = 2;
        int c = a + b;
        User u1 = new User();
        u1.setId(1);
    

局部变量表

例如,对于上图中的main方法,执行时候,会创建一个main线程,在main线程的虚拟机栈中,会压入一个main方法。之后,对于a,b,c这种普通变量,就会被分配在虚拟机栈中。

操作数栈

例如,执行c=a+b时候,就会将a,b压入操作数栈,用于执行加法运算;

动态链接

将符号引用转换为直接引用;我理解的是,将对一些符号的引用,转变为地址指针。

方法出口

标记这个方法执行完,回到调用它的那个方法的哪行。

本地方法栈

结构跟虚拟机栈差不多。主要是存放调用本地方法时候的方法栈;例如,当我们调用Thread的start方法,此时,Java代码会帮我们调用一个标记为native的方法,调用系统的东西去创建线程;

程序计数器

标记当前代码执行到了哪儿。可以先理解为,程序计数器标记了当前字节码(也就是加载到方法区的那个class文件的代码执行到哪儿了)

运行时数据区- 线程共享的部分

对象在这块分配,比如上面的main方法中,new的User对象,就会被分配在这里。

方法区

常量,静态变量,类信息,比如会把class文件,解析后装载到这个地方。与堆相比,主要放的还是那些不经常变的东西。

以上是关于图解Java虚拟机内存模型的主要内容,如果未能解决你的问题,请参考以下文章

13 张图解 Java 中的内存模型

java虚拟机:JVM内存模型

Java虚拟机的内存区域

图解java虚拟机之内存区域

图解Java内存区域及内存溢出异常

Java虚拟机:内存模型详解