【854、运行时数据区域内都存储了什么?】

21 阅读2分钟

在Java中,运行时数据区域的划分相对清晰,以下是Java运行时数据区域的主要部分:

  1. 方法区(Method Area): 也称为永久代(Permanent Generation)(在Java 7及之前的版本中),或元空间(Metaspace)(在Java 8及之后的版本中)。方法区存储类的元数据信息,包括类的结构、静态变量、常量池等。在Java 8及之后的版本中,元空间不再固定于虚拟机内存,而是使用本机内存。

  2. 堆(Heap): 堆用于存储对象实例以及数组等动态分配的内存。Java中的对象都在堆上分配,并由垃圾收集器进行管理。堆被分为新生代和老年代,以支持不同对象的生命周期。

    • 新生代(Young Generation):分为一个Eden区和两个Survivor区,用于存储新创建的对象。大部分对象在这里被创建和销毁。
    • 老年代(Old Generation):存储存活时间较长的对象,当对象在新生代经历多次垃圾回收后仍然存活,就会被移到老年代。
  3. 栈(Stack): 每个线程在Java虚拟机中都会有一个私有的栈,用于存储局部变量、方法调用和返回信息。栈上还会存储引用类型的变量,指向堆中的对象。

  4. 本地方法栈(Native Method Stack): 类似于栈,但用于存储Java代码调用本地(非Java)方法的相关信息。

  5. PC寄存器(Program Counter Register): 存储当前线程执行的字节码指令地址。

  6. 直接内存(Direct Memory): 这部分内存不是Java虚拟机运行时数据区域的一部分,但在内存管理中与Java NIO相关。直接内存用于直接分配堆外内存,从而避免在Java堆和本地堆栈之间来回复制数据。