根据应用的各自的业务特点和需求,选择合理的垃圾回收器搭配。
首先,列举跟垃圾回收器性能相关的几个指标:
吞吐量(Throughput)
系统的吞吐量=用户代码运行时间/(用户代码运行时间+垃圾收集时间),用于度量系统的运行效率。
垃圾回收开销(Garbage Collection overhead)
垃圾回收开销=垃圾回收时间/(垃圾回收时间+用户代码运行时间),即回收时间占总时间的比率。
注意:垃圾回收开销+吞吐量=1,即系统吞吐量高了,其垃圾回收开销就低;系统吞吐量低了,垃圾回收开销就高了
暂停时间间隔(Pause time)
暂停时间间隔是指Java虚拟机在回收垃圾的时,暂停所有应用线程的执行的总时间。
对于串行回收器,停顿时间可能会比较长。对于并发的回收器,由于垃圾回收器和应用程序交替运行,程序的停顿时间会变短,但是其效率很可能不如独占垃圾回收器,则系统的吞吐量可能会较低。
回收频率(Frequency of collection)
平均多久发生一次垃圾回收。
内存占用的大小(Footprint)
如堆的大小。
实时性(Promptness)
自一个对象死亡起,经过多久该对象所占用内存被回收。
其次,将应用划分为几个类型:
(1)高吞吐量应用
新生代Parallel Scavenge+老年代Parallel Old
建议参数配置1:
-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+UseParallelOldGC
建议配置参数2:
-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100 -XX:+UseAdaptiveSizePolicy
(2)低延迟应用或者快速响应时间应用
ParNew新生代+老年代CMS
建议配置参数:
-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
(3)单核或者内存较小应用
新生代Serial + 老年代Serial Old