@zhanjindong
2015-06-08T19:30:27.000000Z
字数 1457
阅读 2723
日均PV:1.4E左右
Tuning
-Xms4096m
-Xmx4096m
-Xss256k
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:NewSize=512m
-XX:MaxNewSize=512m
-XX:SurvivorRatio=16
-XX:+UseParNewGC
-XX:ParallelGCThreads=16
-XX:MaxTenuringThreshold=32
-XX:+UseConcMarkSweepGC
-XX:ParallelCMSThreads=8
-XX:+CMSParallelRemarkEnabled
-XX:+CMSPermGenPrecleaningEnabled
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
-XX:+UseParNewGC
与-XX:+UseParallelGC
的区别:http://stackoverflow.com/questions/2101518/difference-between-xxuseparallelgc-and-xxuseparnewgc
最大的区别:-XX:+UseParNewGC
可以配合老年代的CMS收集器使用,另外-XX:+UseParallelGC
针对特别大的堆(overt 10GB)有特别的优化措施。
-XX:+CMSParallelRemarkEnabled
降低标记停顿
-XX+UseCMSCompactAtFullCollection
在FULL GC的时候, 压缩内存, CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。
-XX:+CMSPermGenPrecleaningEnabled
:CMS的同时对perm gen进行收集?
-XX:CMSInitiatingOccupancyFraction
老年代达到70%CMS开始执行垃圾回收。CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。比如应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还剩10%的空间是5500*10%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的promotion failed;
CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回 收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已 避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。