JVM 配置 以及垃圾收集器的选择

JVM监控的关键指标说明:
a) FGC的环比增加次数。Zabbix每2分钟监控一次,如果2分钟之内,FGC增加的次数高于预定阈值,就报警。
b) JVM内存使用量。当该值大于阈值的时候,就报警。
以上两个值能说明JVM运行的健康情况:如果FGC和JVM内存使用量过多,说明应用内存可能不足(容量不足),就需要扩容或者优化代码。
c) 其他参数:ygc的次数,old、perm的使用大小都需要监控起来。

具体技术方案说明:
推荐的JVM参数模板:
-server -XX:+UseCompressedOops -Xms2048m -Xmx2048m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Xloggc:/wls/applogs/jvm/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/wls/applogs/jvm/HeapDumpOnOutOfMemoryError.log -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Xbootclasspath/p:$JBOSS_HOME/modules/org/jboss/logmanager/main/jboss-logmanager-1.2.2.GA.jar:/wls/jboss/jboss-as-7.1.1.Final/modules/org/jboss/logmanager/log4j/main/jboss-logmanager-log4j-1.0.0.GA.jar:/wls/jboss/jboss-as-7.1.1.Final/modules/org/apache/log4j/main/log4j-1.2.16.jar -Dlogging.configuration=$JBOSS_HOME/standalone/configuration/logging.properties -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl -Dcom.sun.management.snmp.port=9998 -Dcom.sun.management.snmp.interface=localhost -Dcom.sun.management.snmp.acl=false

参数优化理由:

理由 参数
压缩对象,以节省内存 UseCompressedOops
Jvm初始化时,就限制最小和最大的内容一致,避免JVM内存大小调整的时候消耗CPU和耗时。同时为了标准化,限制jvm(最大及最小)内存为2048,虚拟机的内存为4g。并只控制持久带的大小(推荐位jvm大小的1/8),不控制新生代和老年代的大小。 -Xms2048m -Xmx2048m -XX:MaxPermSize=256m
使用新的并行、CMS回收机制,两者可兼容。选用cms的理由是,使得应用在回收时,最少的停顿。并配合cms配置参数 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70

为了支持jvm的snmp监控,结合jboss容器,需要添加相关的logmanager的参数,否则会报错,并设置读取snmp的数据,只能在本机获取。 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Xloggc:/wls/applogs/jvm/gc.log -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/wls/applogs/jvm/HeapDumpOnOutOfMemoryError.log -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
其他:设置编码UTF8,gc日志打印完整的日期,详情;oom时,打印日志等。 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Xloggc:/wls/applogs/jvm/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/wls/applogs/jvm/HeapDumpOnOutOfMemoryError.log -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
运行过程中,保持观察,可做微调。

猜你喜欢

转载自haidaoqi3630.iteye.com/blog/2291498