JVM运行时内存区域深度解析
回答
- 程序计数器:
- 线程私有,记录当前执行字节码指令地址,确保指令按序执行。
- Java 虚拟机栈:
- 线程私有,存储局部变量、操作数栈等。
- 方法调用时创建栈帧,执行完毕弹出,释放变量。
- 本地方法栈:
- 支持本地代码(如 Native 方法)执行,存储本地方法参数、局部变量等,供虚拟机调用本地方法。
- Java 堆:
- 存放对象实例,由虚拟机管理,是内存最大区域,用于垃圾回收,清理未被引用的对象以释放空间。
- 方法区:
- 存储类信息、常量、静态变量、即时编译代码等,实现形式多样(如堆、元空间)。
- 运行时常量池:
- 方法区的一部分,存储编译生成的字面量、符号引用(类全限定名、字段 / 方法名及描述符等)。
- 参考引用:Java 八股/09-JVM/003-运行时常量池和字符串常量池的关系.md
扩展
堆和栈的区别
-
存储位置不同
- 堆是在JVM 堆内存中分配空间,
- 栈是在JVM 栈内存中分配空间。
-
存储的内容不同
- 堆中主要存储对象
- 栈中主要存储本地变量
-
堆是线程共享的,栈是线程独享的。
-
内存释放
- 堆是垃圾回收的主要区域,不再引用这个对象,会被垃圾回收机制会自动回收。
- 栈的内存使用是一种先进后出的机制,栈中的变量会在程序执行完毕后自动释放。
-
栈的大小比堆要小的多,一般是几百到几千字节
-
栈的存储速度比堆快,代码执行效率高
-
堆上会发生 OutofMemoryError,栈上会发生 StackOverflowError
参考引用:Java 八股/09-JVM/002-OutOfMemory vs StackOverflow 的区别?.md