背景
JVM server模式默认使用GC回收器是Parallel Scavenge,这是一个吞吐量优先的回收器,FULL GC时间过长,影响响应。另外默认的JVM参数在针对特定场景可以有优化的空间。
参数调优
Xss
栈大小,默认一个线程的栈为1M。减少栈容量(比如512K)来换取更多的线程,可以有效解决内存溢出。
UseG1GC
这是JDK8最新款商用垃圾收集器,新生代和老年代都能使用,垃圾收集器原理和分类请参考:https://segmentfault.com/a/1190000004233812
MaxGCPauseMillis
最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间,由于场景是要求低时延,所以这个值调的比较小(100ms)
AlwaysPreTouch
这个参数比加,JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。
1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间;
2、可能存在内存碎片的问题。
MaxTenuringThreshold
默认情况下,当新生代执行了15次young gc后,如果还有对象存活在Survivor区中,那么就可以直接将这些对象晋升到老年代,但是由于新生代使用copy算法,如果Survivor区存活的对象太久的话,Survivor区存活的对象就越多,这个就会影响copy算法的性能,使得young gc停顿的时间加长,建议设置成6。
参考链接:
https://blog.csdn.net/linsongbin1/article/details/55049477
http://calvin1978.blogcn.com/articles/jvmoption-7.html