JVM运行时内存区域深度解析

36 阅读2分钟

JVM运行时内存区域深度解析

回答

image-20250329101525057

  1. 程序计数器
    • 线程私有,记录当前执行字节码指令地址,确保指令按序执行。
  2. Java 虚拟机栈
    • 线程私有,存储局部变量、操作数栈等。
    • 方法调用时创建栈帧,执行完毕弹出,释放变量。
  3. 本地方法栈
    • 支持本地代码(如 Native 方法)执行,存储本地方法参数、局部变量等,供虚拟机调用本地方法。
  4. Java 堆
    • 存放对象实例,由虚拟机管理,是内存最大区域,用于垃圾回收,清理未被引用的对象以释放空间。
  5. 方法区
    • 存储类信息、常量、静态变量、即时编译代码等,实现形式多样(如堆、元空间)。
  6. 运行时常量池

扩展

堆和栈的区别
  1. 存储位置不同

    • 堆是在JVM 堆内存中分配空间,
    • 栈是在JVM 栈内存中分配空间。
  2. 存储的内容不同

    • 堆中主要存储对象
    • 栈中主要存储本地变量
  3. 堆是线程共享的,栈是线程独享的

  4. 内存释放

    • 堆是垃圾回收的主要区域,不再引用这个对象,会被垃圾回收机制会自动回收
    • 栈的内存使用是一种先进后出的机制,栈中的变量会在程序执行完毕后自动释放
  5. 栈的大小比堆要小的多,一般是几百到几千字节

  6. 栈的存储速度比堆快,代码执行效率高

  7. 堆上会发生 OutofMemoryError,栈上会发生 StackOverflowError

    参考引用:Java 八股/09-JVM/002-OutOfMemory vs StackOverflow 的区别?.md