【JVM】 内存区域划分

程序计数器 Program Counter Register

记录当前线程执行的字节码行号。
属于线程私有的内存,各线程互不影响。
若执行 Java 方法, 该值为 字节码指令地址;
若执行 native 方法, 则为空。
字节码解释器读取并改变该值来获取下一条字节码指令。

虚拟机栈 VM Stack

也是线程私有的,由栈帧(Stack Frame)组成。
每个方法执行时,都会创建一个 Stack Frame ,
Stack Frame 存储了局部变量表、操作书栈、动态链接、方法出口等信息。
局部变量表存放了基本数据类型、对象引用以及返回地址等。

本地方法栈 Native Method Stack

类似虚拟机栈, 只不过是用在 native 方法。

堆 Heap

堆内存是 JVM 内存最大的一块了,主要用于存储对象实例。
可以粗略的分为新生代和老生代,细致的话可分为 Eden 、From/To Survivor等。

方法区 Method Area (JDK 8 规范用 MetaSpace 替代)

存放类的信息、常量、静态变量、JIT 编译后代码等。
在有些 JVM 实现中,被称为永久代(PermGen)。
在 JDK 8 规范中,该部分被移到 MetaSpace 了。

直接内存 Direct Memory

调用 Native 函数库分配的堆外内存, 并不属于 JVM 运行时内存部分。