Java教程

图解Java虚拟机内存模型

本文主要是介绍图解Java虚拟机内存模型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

JVM虚拟机图

类装载子系统

负责将我们用到的文件,加载到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虚拟机内存模型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!