Java虚拟机内存结构主要包含以下几点:
-
方法区(Method Area):
- 也称为永久代(Permanent Generation)或元空间(Metaspace,JVM 8+版本)。
- 存储类信息、常量、静态变量等。
- 在JVM 8及之前,方法区是有限的,可以通过设置最大永久代大小来控制。在JVM 8+版本中,元空间不再具有固定的大小,而是由操作系统的可用内存动态分配。
-
堆(Heap):
- 存储对象实例和数组。
- Java程序中创建的几乎所有对象都存储在堆中。
- 堆的大小可以通过命令行参数(如-Xms和-Xmx)来设置。
-
虚拟机栈(VM Stack):
- 用于存储方法调用的局部变量、操作数栈、返回值和部分方法的状态。
- 每个线程都有自己的虚拟机栈。
- 虚拟机栈的大小可以通过命令行参数(如-Xss)来设置。
-
本地方法栈(Native Method Stack):
- 与虚拟机栈类似,但用于存储本地方法(Native方法)的调用信息。
-
程序计数器(Program Counter):
- 存储当前线程正在执行的字节码指令的地址。
- 在多线程环境下,每个线程都有自己的程序计数器。
-
堆外内存(Off-Heap Memory):
- 不属于JVM内存结构的一部分,但Java程序可以通过Native接口(如NIO)分配和管理堆外内存。
- 堆外内存通常用于处理大量数据或需要更高性能的场景,因为它可以绕过Java堆的垃圾回收机制。
-
直接内存(Direct Memory):
- 也是一种堆外内存,但通常用于NIO通道和缓冲区的操作。
- 可以通过
ByteBuffer.allocateDirect()
来分配。
jdk1.7:
jdk1.8: