JVM内存划分详解

JVM内存划分详解

JVM内存区域

程序计数器

  • 记录当前线程执行的字节码行号
  • 线程私有,各线程独立计数
  • 唯一不会OOM的区域

虚拟机栈

  • 描述Java方法执行的内存模型
  • 每个方法创建一个栈帧
  • 包含:局部变量表、操作数栈、动态链接、方法返回地址
1
2
3
4
// 栈深度过深会抛出StackOverflowError
public void deepRecursion() {
deepRecursion();
}

本地方法栈

  • 为Native方法服务
  • 与虚拟机栈类似

  • 最大内存区域
  • 存放对象实例
  • 垃圾回收主要区域
  • 分代:新生代、老年代

方法区

  • 存储类信息、静态变量、常量
  • JVM规范中的”永久代”
  • JDK 8后用元空间替代

内存分配

  • 对象优先在Eden区分配
  • 大对象直接进入老年代
  • 长期存活对象进入老年代

总结

理解JVM内存划分是调优基础,不同区域有不同的存储内容和垃圾回收策略。