JVM内存区域

JVM内存区域

BP2ZcT.png

内存划分

JVM虚拟机在运行时将内存空间划分为几个区域,这些区域有不同的功能创建时间销毁时间。虚拟机内存划分只是从功能上进行的分割,不同的虚拟机的版本有不同的方式实现方式。

  • 程序计数器(PC):存储各个线程运行的当前指令的地址。

  • 虚拟机栈(Stack):每个线程在运行时都会创建自己的栈,进入每个方法时创建一个栈帧压入栈中,用于保存当前方法内的局部变量操作数栈方法出口地址等。

  • 堆(Heap):虚拟机中空间最大的内存区域,各个线程共享的区域,存储虚拟机中绝大数对象的。为了更方便的管理这块区域,各种垃圾回收算法会将这个区划分为更细致的区域,例如新生代老年代等。

  • 方法区(Method Area):各个类被加载后的==类信息、常量、静态变量、方法代码==等内容存储的空间。

  • 常量池(Constant Pool):方法区中存储常量的信息,这里的常量不仅仅指的是Java语言层面的常量,还有一些字面量和符号引用。常量池可以在运行时添加,例如String的intern()方法。

  • 直接内存(Direct Memory):一块虚拟机以外的内存空间,是宿主的内存空间。在NIO场景中运用,提高虚拟机与外界数据交互的效率。

  • **本地方法栈(Native Stack)**:虚拟机在调用本地方法时调用的栈空间。

虚拟机栈

虚拟机使用栈存储一个线程的方法调用链。栈内有若干栈帧,存储着调用链中方法的信息。一个栈帧中存储以下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
  |                |
--+----------------+
| OP Stack |
|----------------|
| (Info) |
| Method Link |
| Return Addr |
| Ext Info |
|----------------|
| Local Variable |
| Table |
--+----------------+
| |

操作数栈

JVM使用操作数栈暂存字节码指令执行过程中的数据

方法动态连接

方法返回地址

局部变量表

。。。

方法区

。。。