面试题答案
一键面试调整垃圾回收算法
- CMS(Concurrent Mark Sweep):
- 特点:CMS是一种以获取最短回收停顿时间为目标的垃圾回收器,在老年代使用。它在垃圾回收过程中,尽量让垃圾回收线程和应用线程并发执行,以减少应用线程的停顿时间。
- 适用场景:适用于对响应时间要求高的高并发应用,如Web应用等。
- G1(Garbage - First):
- 特点:G1将堆内存划分为多个大小相等的Region,它可以预测停顿时间,并优先回收价值最大(即垃圾最多)的Region。G1能在有限的时间内尽可能获取更高的回收效率,同时也能较好地控制停顿时间。
- 适用场景:适用于堆内存较大,对停顿时间有严格要求的高并发应用,比如大数据处理应用等。
相关参数调整
- CMS相关参数:
-XX:+UseConcMarkSweepGC
:启用CMS垃圾回收器。-XX:CMSInitiatingOccupancyFraction
:设置老年代空间使用达到多少比例时开始执行CMS垃圾回收。例如设置为70,表示老年代空间使用达到70%时开始CMS回收。若设置过低,会导致频繁回收;设置过高,可能会导致老年代空间不足引发Full GC。-XX:+CMSParallelRemarkEnabled
:开启并行Remark阶段,能缩短Remark停顿时间。
- G1相关参数:
-XX:+UseG1GC
:启用G1垃圾回收器。-XX:MaxGCPauseMillis
:设置G1收集器的最大停顿时间目标,默认值是200毫秒。G1会尽力满足这个停顿时间目标,但不保证一定达到。例如设置为100,表示希望每次垃圾回收停顿时间不超过100毫秒。-XX:G1HeapRegionSize
:设置G1 Region的大小,取值范围是1MB到32MB,且必须是2的幂次方。合理设置该值可以优化G1的回收效率,比如对于大堆可以设置较大的值。
举例说明
假设我们有一个高并发的Web应用,使用Tomcat服务器。
- 使用CMS:
- 在启动脚本中添加参数:
JAVA_OPTS="-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled"
- 应用在运行过程中,当老年代空间使用达到70%时,CMS垃圾回收器会启动,并且由于开启了并行Remark阶段,Remark停顿时间会缩短,从而减少对应用性能的影响,使Web应用能更快地响应请求。
- 在启动脚本中添加参数:
- 使用G1:
- 在启动脚本中添加参数:
JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=16M"
- 应用运行时,G1垃圾回收器会按照设置的最大停顿时间目标(100毫秒)来进行垃圾回收,并且由于Region大小设置为16M,在回收过程中能更高效地管理内存,对于高并发Web应用,能在短时间内完成垃圾回收,减少对用户请求响应的影响。
- 在启动脚本中添加参数: