面试题答案
一键面试新生代特点
- 对象存活时间短:大多数新创建的对象都在新生代,这些对象生命周期较短,很多对象很快就不再被引用。
- 分三个区域:由一个 Eden 区和两个 Survivor 区(Survivor0 和 Survivor1)组成。新对象一般优先分配在 Eden 区,当 Eden 区满时,会触发 Minor GC,存活的对象会被复制到 Survivor 区,在 Survivor 区经过一定次数(默认15次)的 GC 后,如果还存活则晋升到老年代。
老年代特点
- 对象存活时间长:进入老年代的对象通常是经过多次 Minor GC 依然存活的对象,它们有较长的生命周期。
- 空间较大:相对新生代,老年代空间通常较大,因为它存储的是长期存活的对象。
新生代内存使用和性能优化策略
- 合理设置新生代大小:通过
-Xmn
参数设置新生代大小。若新生代过小,会导致频繁 Minor GC;若过大,可能会减少老年代空间,增加 Full GC 的频率。 - 优化 Eden 与 Survivor 比例:可以通过
-XX:SurvivorRatio
参数调整 Eden 区与 Survivor 区的比例。合适的比例能减少对象在新生代复制的开销。 - 选择合适的垃圾收集器:如 Serial 收集器(适合单线程环境)、ParNew 收集器(多线程,常与 CMS 收集器配合)、Parallel Scavenge 收集器(关注吞吐量),根据应用特点选择能提高新生代垃圾回收效率。
老年代内存使用和性能优化策略
- 合理设置老年代大小:通过
-Xmx
和-Xms
参数设置堆大小,间接影响老年代大小。老年代大小需根据应用中对象长期存活的情况合理设置,避免过小导致频繁 Full GC,过大则浪费内存。 - 选择合适的垃圾收集器:CMS(Concurrent Mark Sweep)收集器适用于对响应时间敏感的应用,能在应用运行过程中并发进行垃圾回收;G1(Garbage - First)收集器适用于大堆内存,将堆划分为多个 Region,更细粒度地管理内存,可有效减少 Full GC 的停顿时间。
- 调优 Full GC:减少老年代对象晋升速度,通过优化代码减少长期存活对象的产生;调整垃圾收集器参数,如
-XX:CMSInitiatingOccupancyFraction
控制 CMS 收集器开始回收的老年代占用比例,避免过早或过晚触发 Full GC。