在JRockit的GC参数如下
-jrockit -Xms1636m -Xmx1636m -Xgc:parallel-Xjvmpi:allocs=off,monitors=off,entryexit=off
在Sun hotSpot下的GC参数如下
JAVA_OPTS="-server -Xms4g -Xmx4g -XX:PermSize=296m-XX:MaxPermSize=296m -Xmn1600m -XX:+UseConcMarkSweepGC-XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction=82 -XX:+PrintGCTimeStamps-XX:+DisableExplicitGC -XX:SurvivorRatio=10"
JAVA_OPTS="${JAVA_OPTS}-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/home/admin/logs/java.hprof"
JAVA_OPTS="${JAVA_OPTS} -XX:+UseCompressedOops"
JAVA_OPTS="$JAVA_OPTS -verbose:gc -Xloggc:/home/admin/logs/gc.log-XX:+PrintGCDetails -XX:+PrintGCDateStamps"
主要分析一下hotSpot虚拟机参数
参数详解:
XX:+UseConcMarkSweepGC:使用并发收集器,适用于响应时间要求比较高的中,大规模应用。
XX:+UseCMSCompactAtFullCollection:是表是执行Full GC后对内存进行整理压缩,免得产生内存碎片
XX:+CMSParallelRemarkEnabled:降低标记停顿
XX:+CMSPermGenSweepingEnabled:FULLGC触发对PermGen区的回收 JDK1.6以后
XX:+CMSClassUnloadingEnabled:配置了CMSClassUnloadingEnabled,且Perm Gen的使用达到一定的比率 默认为92%.会触发CMS
XX:+UseCMSInitiatingOccupancyOnly:指示只有在 oldgeneration 在使用了初始化的比例后concurrentcollector 启动收集
XX:CMSInitiatingOccupancyFraction=82:使用cms作为垃圾回收使用82%后开始CMS收集
XX:+PrintGCTimeStamps:打印GC信息
-XX:+DisableExplicitGC标志自动将System.gc()调用转换成一个空操作
-XX:SurvivorRatio=10:Eden区与Survivor区的大小比值。设置为10,则两个Survivor区与一个Eden区的比值为2:10,一个Survivor区占整个年轻代的1/12
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof:当JVM发生OOM时,自动生成DUMP文件。示生成DUMP文件的路径,也可以指定文件名称
-XX:+UseCompressedOops:指针压缩通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)
-verbose:gc表示输出虚拟机中GC的详细情况和-XX:+PrintGCTimeStamps一起用
以下参考
http://rednaxelafx.iteye.com/blog/906807
其中要注意的是
DisableExplicitGC
其中一种情况是下述三个条件同时满足时会发生的:
1、应用本身在GC堆内的对象行为良好,正常情况下很久都不发生full GC;
2、应用大量使用了NIO的direct memory,经常、反复的申请DirectByteBuffer
3、使用了-XX:+DisableExplicitGC
此时有可能会抛出这个异常:java.lang.OutOfMemoryError: Direct buffer memory 。
所以
如果用了该参数而且遇到direct memory的OOM,可以尝试去掉该参数看是否能避开这种OOM。如果担心System.gc()调用造成full GC频繁,可以尝试下面提到 -XX:+ExplicitGCInvokesConcurrent 参数