Java 内存区域(运行时数据区域)的划分
Java 的内存区域在运行时主要分为以下几个部分,这些区域的划分是由 Java 虚拟机规范定义的:
方法区(Method Area):
- 存储每个类的结构信息:运行时常量池、字段和方法数据、构造函数以及普通方法的字节码内容。
- 是所有线程共享的内存区域。
- 在 HotSpot 虚拟机中,方法区也称为永久代(PermGen),在 Java 8 中,永久代被移除了,取而代之的是元空间(Metaspace)。
堆(Heap):
- 堆是所有线程共享的一块内存区域,用于存储对象实例。
- 几乎所有的对象实例都在这里分配内存,是垃圾收集器(GC)管理的主要区域。
- 堆可以进一步细分为新生代和老年代,其中新生代又分为 Eden 区和 Survivor 区。
虚拟机栈(Java Virtual Machine Stack):
- 每个线程都有自己的虚拟机栈,栈中保存的是栈帧(Frame)。
- 每个栈帧对应一次方法调用,在栈帧中存储了局部变量表、操作数栈、动态链接、方法出口等信息。
- 用于方法调用和执行。
本地方法栈(Native Method Stack):
- 与虚拟机栈类似,但它为本地方法服务。
- 它也为每个线程创建一个栈,主要用于支持 Native 方法的执行。
程序计数器(Program Counter Register):
- 每个线程都有一个独立的程序计数器,记录当前线程所执行的字节码的行号指示器。
- 是线程私有的内存区域。
这些区域中,堆和方法区是线程共享的,而虚拟机栈、程序计数器和本地方法栈是线程私有的。这种划分有助于提高程序执行的效率、保证数据的安全性及维护,并可以通过调优这些区域来优化 Java 应用的性能。