面试题答案
一键面试不同垃圾回收器工作原理
- CMS(Concurrent Mark Sweep)
- 工作原理:
- 初始标记(STW):暂停所有应用线程,标记出GC Roots直接关联的对象。此阶段停顿时间较短。
- 并发标记:与应用线程并发执行,从GC Roots开始遍历整个对象图,标记出所有可达对象。
- 重新标记(STW):暂停应用线程,修正并发标记期间因应用程序继续运行而导致标记产生变动的那一部分对象的标记记录。停顿时间比初始标记稍长。
- 并发清除:与应用线程并发执行,清除标记为不可达的对象所占用的内存空间。
- 适用场景:适用于注重应用响应时间,希望系统停顿时间最短的场景,比如Web应用服务器。
- 优化:
- 调整堆大小,避免频繁Full GC。
- 合理设置并发线程数,通过
-XX:ParallelCMSThreads
参数设置,一般为CPU核数的1/4到1/2。 - 调整CMS收集器的启动阈值,
-XX:CMSInitiatingOccupancyFraction
参数,防止CMS在堆空间剩余过少时才启动,导致Full GC。
- 工作原理:
- G1(Garbage - First)
- 工作原理:
- 初始标记(STW):暂停应用线程,标记出GC Roots直接关联的对象。
- 并发标记:与应用线程并发执行,构建对象图,标记出所有可达对象。
- 最终标记(STW):暂停应用线程,处理并发标记阶段的少量遗留数据。
- 筛选回收(STW):根据各个Region的回收价值和成本排序,选择部分Region进行回收,回收时暂停应用线程。
- 适用场景:适用于大堆内存,同时兼顾高吞吐量和低停顿时间的场景,如大数据处理、云计算等。
- 优化:
- 设置堆大小和Region大小,
-XX:G1HeapRegionSize
设置Region大小,一般为2的幂次方,范围1MB到32MB。 - 调整目标暂停时间,
-XX:MaxGCPauseMillis
参数,G1会尽量满足此目标,但不是绝对保证。 - 合理设置并发标记线程数,
-XX:ConcGCThreads
参数,一般为(ParallelGCThreads + 3) / 4
。
- 设置堆大小和Region大小,
- 工作原理:
高并发、大数据量处理应用GC暂停时间过长调优思路
- 分析垃圾回收日志
- 技术细节:使用
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
等参数打印详细的垃圾回收日志。通过分析日志确定频繁出现长时间暂停的是哪种垃圾回收(如Young GC、Full GC),以及每次回收的时间、回收前后堆内存的使用情况等。例如,若Full GC频繁且耗时久,可能是堆空间不足或对象晋升策略不合理。
- 技术细节:使用
- 调整堆内存大小
- 技术细节:
- 增大堆内存:如果频繁出现Full GC,可能是堆内存过小。通过
-Xms
和-Xmx
参数设置初始堆大小和最大堆大小。例如,对于64位系统,可适当增大-Xmx
到物理内存的3/4,但要注意不能过大导致系统交换空间使用过多。 - 调整新生代与老年代比例:根据应用对象的生命周期特点调整
-XX:NewRatio
参数(设置老年代与新生代的比例)。如果对象存活时间短,可适当增大新生代空间,减少对象晋升到老年代的频率。
- 增大堆内存:如果频繁出现Full GC,可能是堆内存过小。通过
- 技术细节:
- 选择合适的垃圾回收器
- 技术细节:对于高并发、大数据量处理的应用,G1垃圾回收器通常是较好的选择。它能在大堆内存下有效控制停顿时间。通过
-XX:+UseG1GC
参数启用G1垃圾回收器。若应用对响应时间极为敏感,且堆内存不是特别大,CMS回收器也可考虑,但需注意其在高并发下的内存碎片问题。
- 技术细节:对于高并发、大数据量处理的应用,G1垃圾回收器通常是较好的选择。它能在大堆内存下有效控制停顿时间。通过
- 优化对象创建与生命周期管理
- 技术细节:
- 对象复用:尽量复用对象,减少对象的频繁创建和销毁。例如,使用对象池技术,像数据库连接池、线程池等,避免重复创建相同类型的对象。
- 避免大对象创建:大对象容易直接进入老年代,导致老年代空间快速耗尽引发Full GC。尽量将大对象拆分成小对象,或者使用TLAB(Thread - Local Allocation Buffer),每个线程先在自己的TLAB中分配对象,减少线程间的内存分配竞争。
- 技术细节:
- 调整垃圾回收器参数
- 技术细节:
- G1参数调整:除了前面提到的
MaxGCPauseMillis
、G1HeapRegionSize
、ConcGCThreads
等参数外,还可调整-XX:G1NewSizePercent
和-XX:G1MaxNewSizePercent
控制新生代的大小范围。 - CMS参数调整:如前文所述,合理设置
ParallelCMSThreads
、CMSInitiatingOccupancyFraction
等参数,优化CMS的运行。
- G1参数调整:除了前面提到的
- 技术细节: