图解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虚拟机内存模型的主要内容,如果未能解决你的问题,请参考以下文章