JVM调优经验(不一定准确)
1. 整体思路:
Young GC发生的频率比较频繁是正常现象,但尽可能让他的单次执行时间少点
Full GC发生的频率不应该太高
2. 使用的监控命令:
jps -m -l 列出JVM中运行的进程状态信息(这里可以获取某个进程的pid, 供后续命令使用)
jstat -gcutil pid 10s 3 对堆内存的使用情况、gc信息等进行实时的命令行统计
3. 具体设置参数如下:
-Xms、-Xmx
这两个参数一定要设置,而且必须设置成相等,不能使用默认值。如果不设置,可能会出现频繁Full GC、内存泄露。
设置成相等,主要是为了避免每次GC之后重新给堆内存分配大小。
另外,这俩值不要设置的太大。虽然建议堆的最大值设置为可用内存最大值的80%(使用命令free或cat /proc/meminfo查看,实际可用物理内存=free+buffer+cache),但是当设置了80%之后,服务器的内存占用一般都达到了90%以上,所以可以适当降低一点。
-Xmn、-XX:SurvivorRatio
最好不要用-XX:NewRatio,因为同CMS GC一起使用时会失效。
如果不设置此值,不设置CMS GC,那么年轻代和年老代比值大约是1:2
如果不设置此值,设置了CMS GC,那么年轻代会变的很小,年老大占很大
如果Young Generation大小分配不合理或空间比较小,这个时候导致对象很容易进入Old Generation中,比如,如果s0和s1太小,gc之后无法装下存活的对象,那么就会直接进入年老代中,而Old Generation中回收具体对象的时候速度是远远低于Young Generation回收速度。
要考虑年老代和新生代的比例(sun官方建议-Xmn为整个堆的3/8),考虑Eden和survives的比例(默认是8:1:1)
如果不知道该设置多少,可以先按官方要求设置,如果不合适,再进行调整。
是否使用CMS GC。
其他参数,根据具体情况设置,注意,未必设置了之后就会提升性能。不同的应用系统,不同的电脑硬件条件,都可能不一样。