Java调优经验

JVM配置示例:

JAVA_OPTS="-server -XX:+UseConcMarkSweepGC -XX:PermSize=100M  -XX:MaxPermSize=300M -Xms8g -Xmx8g -Xmn4g -Xss256k -XX:MaxNewSize=4g -XX:NewSize=4g -XX:SurvivorRatio=2  -Xnoclassgc -XX:+DisableExplicitGC  -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=92 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintHeapAtGC -Xloggc:/data/resys/zhenjing/tomcat-solr-slave/logs/gc.log -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -Duser.timezone=Asia/Shanghai -XX:MaxDirectMemorySize=7g -Dcom.tc.productkey.path=/data/conf/terracotta-license.key"

说明:

# 各个堆栈区域空间分配
-server 
-XX:PermSize=100M  
-XX:MaxPermSize=300M 
-Xms8g -Xmx8g -Xmn4g -Xss256k 
-XX:MaxNewSize=4g -XX:NewSize=4g 
-XX:SurvivorRatio=2       # eden = from+to

# 回收算法相关。该配置以满足响应实时性为目的。
-Xnoclassgc    #禁用类垃圾回收,性能会高一点; 
-XX:+DisableExplicitGC   #禁止System.gc()
-XX:+UseConcMarkSweepGC    #老年代回收采用CMS算法
-XX:+UseParNewGC                #年轻代回收采用并行算法
-XX:ParallelGCThreads=8 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction=0 
-XX:+CMSClassUnloadingEnabled 
-XX:CMSInitiatingOccupancyFraction=92 
-XX:SoftRefLRUPolicyMSPerMB=0 

# gc日志相关。 采用 jstat -gcutil PID 10000 监控更简洁直观。
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:+PrintHeapAtGC 
-Xloggc:logs/gc.log 
-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 
-Duser.timezone=Asia/Shanghai 

# BigMemory for Ehcache 相关配置,启用本地缓存,避免触发gc。
-XX:MaxDirectMemorySize=7g 
-Dcom.tc.productkey.path=/data/conf/terracotta-license.key

几点说明:

Young GC: 一般情况下,当生成新对象,触发Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到空的Survivor区(to Survivor)。然后整理上次存放数据的Survivor(from Survivor),将依然存活的对象放入新的to Survivor。若多次整理后,对象依然存活,且达到阈值(由 InitialTenuringThreshold 和 MaxTenuringThreshold 控制,默认值为7和15),则将对象放入老年代。

Full GC: 主要是回收老年代的失效对象,一般同时触发整理年轻代。

几个参考数据:gc的核心工作是:清除无效对象;移动有效对象。若需要清除的无效对象很多,或需要移动的有效对象很多,则gc过程耗时。对于4G的年轻代,2G的eden代,一次Young GC大概耗时100~200ms。 若实际应用中,Young GC超过200ms,一般需要调优JVM。调优的目标:1)降低单次Young GC时间; 2) 降低Full GC次数。  Young GC 的次数和程序的负载和对象使用方式(代码实现方式)有关,优化空间不大。

测试过 -XX:+AggressiveHeap 选项,对gc影响不大。测试过 -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking 选项,对gc影响不大。 

对于-XX:LargePageSizeInBytes=128m选项,有些麻烦,且可能导致Full GC变长,没试用迅龙提供

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值