JVM内存结构概述
JVM(Java虚拟机)内存结构是Java程序运行时的核心组成部分,分为多个区域,每个区域负责不同的功能。主要分为线程共享区域 和线程私有区域。
线程共享区域
-
堆(Heap)
- 存储对象实例和数组,是垃圾回收的主要区域。
- 分为新生代(Young Generation)和老年代(Old Generation),新生代进一步划分为Eden、Survivor0、Survivor1区。
- 通过
-Xms和-Xmx参数设置初始和最大堆大小。
-
方法区(Method Area)
- 存储类信息、常量、静态变量、即时编译器编译后的代码等。
- JDK 8之前称为"永久代"(PermGen),JDK 8及之后改为"元空间"(Metaspace),使用本地内存。
- 通过
-XX:MetaspaceSize和-XX:MaxMetaspaceSize调整大小。
-
运行时常量池(Runtime Constant Pool)
- 方法区的一部分,存储编译期生成的字面量和符号引用。
线程私有区域
-
程序计数器(Program Counter Register)
- 记录当前线程执行的字节码指令地址,线程切换后能恢复到正确位置。
- 唯一不会抛出
OutOfMemoryError的区域。
-
虚拟机栈(JVM Stack)
- 存储栈帧(Frame),每个方法调用对应一个栈帧,包含局部变量表、操作数栈、动态链接和方法返回地址。
- 栈深度超过限制会抛出
StackOverflowError;动态扩展失败会抛出OutOfMemoryError。 - 通过
-Xss参数设置栈大小。
-
本地方法栈(Native Method Stack)
- 为Native方法服务,与虚拟机栈类似,可能抛出
StackOverflowError或OutOfMemoryError。
- 为Native方法服务,与虚拟机栈类似,可能抛出
直接内存(Direct Memory)
- 非JVM规范定义的内存,但频繁使用(如NIO的
ByteBuffer)。 - 通过
-XX:MaxDirectMemorySize设置大小,溢出时抛出OutOfMemoryError。
内存参数示例
java
// 常见JVM内存参数
-Xms256m // 初始堆大小
-Xmx1024m // 最大堆大小
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
-Xss256k // 线程栈大小