MST
星途 面试题库

面试题:Java中Java堆内存的分配原则是什么

请简述在Java中,对象在堆内存中的分配遵循哪些原则,比如对象优先在哪个区域分配,如果该区域空间不足会怎样处理等。
45.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 对象优先在 Eden 区分配
    • 当新对象创建时,大多数情况下会首先在堆内存的 Eden 区分配空间。Eden 区是新生代的一部分,Java 堆内存中新生代又分为 Eden 区和两个 Survivor 区(一般称为 Survivor from 和 Survivor to)。
  2. Eden 区空间不足的处理
    • 当 Eden 区空间不足时,会触发 Minor GC(新生代垃圾回收)。在 Minor GC 过程中,Eden 区中存活的对象会被复制到 Survivor 区(一般是 Survivor from 区),同时 Eden 区被清空。
    • 如果 Survivor from 区也无法容纳从 Eden 区复制过来的存活对象,这些对象会直接晋升到老年代。
  3. Survivor 区对象晋升原则
    • 每次 Minor GC 后,对象在 Survivor 区中每熬过一次垃圾回收,年龄就增加 1。当对象的年龄达到一定阈值(默认是 15,可以通过 -XX:MaxTenuringThreshold 参数调整),就会被晋升到老年代。
    • 另外,如果 Survivor 区中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。
  4. 大对象直接进入老年代
    • 如果创建的对象过大(超过了 -XX:PretenureSizeThreshold 参数指定的大小,默认值为 0,即关闭该功能。当指定该值后,大于此值的对象直接在老年代分配),为了避免在 Eden 区和 Survivor 区之间发生大量的内存复制,该大对象会直接在老年代分配空间。
  5. 老年代空间不足处理
    • 当老年代空间不足时,会触发 Full GC(全量垃圾回收)。Full GC 不仅会清理老年代,还会清理新生代和方法区等。如果 Full GC 后老年代仍然无法分配足够的空间,就会抛出 OutOfMemoryError 异常。