线上常用的虚拟机配置详解

在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 参数 



 

你可能感兴趣的:(虚拟机)