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