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

本文详细解析了HotSpot JVM下的垃圾回收(GC)参数及其作用,包括使用并发收集器、减少内存碎片、调整堆内存比例等关键配置。适用于追求高性能和稳定性的应用程序。

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



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值