`

JVM基础四:生产环境参数实例及分析【生产环境实例增加中】

 
阅读更多

java application项目(非web项目)

改进前:

  1. -Xms128m  
  2. -Xmx128m  
  3. -XX:NewSize=64m  
  4. -XX:PermSize=64m  
  5. -XX:+UseConcMarkSweepGC  
  6. -XX:CMSInitiatingOccupancyFraction=78 
  7. -XX:ThreadStackSize=128-Xloggc:logs/gc.log  
  8. -Dsun.rmi.dgc.server.gcInterval=3600000 
  9. -Dsun.rmi.dgc.client.gcInterval=3600000 
  10. -Dsun.rmi.server.exceptionTrace=true 

问题:

◆  permsize 设置较小,很容易达到报警范围(0.8)

◆ 没有设置MaxPermSize,堆增长会带来额外压力。

◆ NewSize较大,old gen 剩余空间64m,一方面可能会带来old区容易增长到报警范围(监控数据显示oldgenused长期在50m左右,接近78%,容易出现full gc),另一方面也存在promontion fail风险。

改进后:

  1. -Xms128m  
  2. -Xmx128m  
  3. -Xmn24m  
  4. -XX:PermSize=80m  
  5. -XX:MaxPermSize=80m  
  6. -Xss256k-XX:SurvivorRatio=1 
  7. -XX:MaxTenuringThreshold=20 
  8. -XX:+UseParNewGC  
  9. -XX:+UseConcMarkSweepGC  
  10. -XX:CMSInitiatingOccupancyFraction=75 
  11. -XX:+UseCMSCompactAtFullCollection  
  12. -XX:+CMSParallelRemarkEnabled  
  13. -XX:CMSFullGCsBeforeCompaction=2 
  14. -XX:SoftRefLRUPolicyMSPerMB=0 
  15. -XX:+PrintClassHistogram  
  16. -XX:+PrintGCDetails  
  17. -XX:+PrintGCTimeStamps  
  18. -XX:+PrintHeapAtGC  
  19. -Xloggc:logs/gc.log  
  20. -Dsun.rmi.dgc.server.gcInterval=3600000 
  21. -Dsun.rmi.dgc.client.gcInterval=3600000 
  22. -Dsun.rmi.server.exceptionTrace=true 

修改点:

◆ PermSize与MaxPermSize都设置为80,一方面避免non heap warn(报警阀值0.8 非对内存一般占用到60M以内),一方面避免堆伸缩带来的压力

◆ 通过设置Xmn=24M及SurvivorRatio=1 使得Eden区=from space=to space=8M,降低了Eden区大小,降低YGC的时间(降低到3-4ms左右),同时通过设MaxTenuringThreshold=20,使得old gen的增长很缓慢。带来的问题是YGC的次数明显提高了很多。

◆ 其他参数优化 修改后带来的好处见JVM参数设置

再次改进后

  1. -Xms128m  
  2. -Xmx128m  
  3. -Xmn36m  
  4. -XX:PermSize=80m  
  5. -XX:MaxPermSize=80m  
  6. -Xss256k  
  7. -XX:SurvivorRatio=1 
  8. -XX:MaxTenuringThreshold=20 
  9. -XX:+UseParNewGC  
  10. -XX:+UseConcMarkSweepGC  
  11. -XX:CMSInitiatingOccupancyFraction=73 
  12. -XX:+UseCMSCompactAtFullCollection  
  13. -XX:+CMSParallelRemarkEnabled  
  14. -XX:CMSFullGCsBeforeCompaction=2 
  15. -XX:SoftRefLRUPolicyMSPerMB=0 
  16. -XX:+PrintClassHistogram  
  17. -XX:+PrintGCDetails  
  18. -XX:+PrintGCTimeStamps  
  19. -XX:+PrintHeapAtGC  
  20. -Xloggc:logs/gc.log  
  21. -Dsun.rmi.dgc.server.gcInterval=3600000 
  22. -Dsun.rmi.dgc.client.gcInterval=3600000 
  23. -Dsun.rmi.server.exceptionTrace=true 

修改点:

在上面的基础上调整Xmn大小到36M,设置CMSInitiatingOccupancyFraction=73。

Dden区与Survivor区大小都增加到12M,通过CMSInitiatingOccupancyFraction计算公式,计算得出value为73是,可以避免promotion faild问题,同时满足堆内存监控报警值在80%:内存大小128M*80%=102.4M 102.4M-36M=66.4M(老生代达到此值报警) 老生代达到67.15M(92M*0.73)将发生Full GC,所以在老生代大小达到66.4M时也就是WARN报警时将很有可能出现Full GC。

增大了Eden和Survivor区的值,会减小YGC的次数,但由于空间变大理论上也会相应的增加YGC的时间,不过由于新生代本身就很小(才36M)这点儿变化可以忽略掉。实际的监控值显示YGC的时间在4-5ms之间。是可以接受范围。

SurvivorRatio 这个值还得在仔细考虑下,有待优化中

网上某个牛人的配置 :每天几百万pv一点问题都没有,网站没有停顿

  1. $JAVA_ARGS  
  2. .="  
  3. -Dresin.home=$SERVER_ROOT  
  4. -server  
  5. -Xms6000M  
  6. -Xmx6000M  
  7. -Xmn500M  
  8. -XX:PermSize=500M  
  9. -XX:MaxPermSize=500M  
  10. -XX:SurvivorRatio=65536 
  11. -XX:MaxTenuringThreshold=0 
  12. -Xnoclassgc  
  13. -XX:+DisableExplicitGC  
  14. -XX:+UseParNewGC  
  15. -XX:+UseConcMarkSweepGC  
  16. -XX:+UseCMSCompactAtFullCollection  
  17. -XX:CMSFullGCsBeforeCompaction=0 
  18. -XX:+CMSClassUnloadingEnabled-XX:  
  19. -CMSParallelRemarkEnabled  
  20. -XX:CMSInitiatingOccupancyFraction=90 
  21. -XX:SoftRefLRUPolicyMSPerMB=0 
  22. -XX:+PrintClassHistogram  
  23. -XX:+PrintGCDetails  
  24. -XX:+PrintGCTimeStamps  
  25. -XX:+PrintHeapAtGC  
  26. -Xloggc:log/gc.log  
  27. "; 

说明一下, -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0就是去掉了救助空间;

-Xnoclassgc禁用类垃圾回收,性能会高一点;

-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能;

-XX:+UseParNewGC,对年轻代采用多线程并行回收,这样收得快;

带CMS参数的都是和并发回收相关的,不明白的可以上网搜索;

CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。在我的应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还剩10%的空间是5500*10%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的promotion failed;

SoftRefLRUPolicyMSPerMB这个参数我认为可能有点用,官方解释是softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap,我觉得没必要等1秒;

  1. -Xmx4000M  
  2. -Xms4000M  
  3. -Xmn600M  
  4. -XX:PermSize=500M  
  5. -XX:MaxPermSize=500M  
  6. -Xss256K  
  7. -XX:+DisableExplicitGC  
  8. -XX:SurvivorRatio=1 
  9. -XX:+UseConcMarkSweepGC  
  10. -XX:+UseParNewGC  
  11. -XX:+CMSParallelRemarkEnabled  
  12. -XX:+UseCMSCompactAtFullCollection  
  13. -XX:CMSFullGCsBeforeCompaction=0 
  14. -XX:+CMSClassUnloadingEnabled  
  15. -XX:LargePageSizeInBytes=128M  
  16. -XX:+UseFastAccessorMethods  
  17. -XX:+UseCMSInitiatingOccupancyOnly  
  18. -XX:CMSInitiatingOccupancyFraction=80 
  19. -XX:SoftRefLRUPolicyMSPerMB=0 
  20. -XX:+PrintClassHistogram  
  21. -XX:+PrintGCDetails  
  22. -XX:+PrintGCTimeStamps  
  23. -XX:+PrintHeapAtGC  
  24. -Xloggc:log/gc.log 

改进方案:

上面方法不太好,因为没有用到救助空间,所以年老代容易满,CMS执行会比较频繁。我改善了一下,还是用救助空间,但是把救助空间加大,这样也不会有promotion failed。
具体操作上,32位Linux和64位Linux好像不一样,64位系统似乎只要配置MaxTenuringThreshold参数,CMS还是有暂停。为了解决暂停问题和promotion failed问题,最后我设置-XX:SurvivorRatio=1 ,并把MaxTenuringThreshold去掉,这样即没有暂停又不会有promotoin failed,而且更重要的是,年老代和永久代上升非常慢(因为好多对象到不了年老代就被回收了),所以CMS执行频率非常低,好几个小时才执行一次,这样,服务器都不用重启了。

某网友:

  1. $JAVA_ARGS  
  2. .="  
  3. -Dresin.home=$SERVER_ROOT  
  4. -server  
  5. -Xmx3000M  
  6. -Xms3000M  
  7. -Xmn600M  
  8. -XX:PermSize=500M  
  9. -XX:MaxPermSize=500M  
  10. -Xss256K  
  11. -XX:+DisableExplicitGC  
  12. -XX:SurvivorRatio=1 
  13. -XX:+UseConcMarkSweepGC  
  14. -XX:+UseParNewGC  
  15. -XX:+CMSParallelRemarkEnabled  
  16. -XX:+UseCMSCompactAtFullCollection  
  17. -XX:CMSFullGCsBeforeCompaction=0 
  18. -XX:+CMSClassUnloadingEnabled  
  19. -XX:LargePageSizeInBytes=128M  
  20. -XX:+UseFastAccessorMethods  
  21. -XX:+UseCMSInitiatingOccupancyOnly  
  22. -XX:CMSInitiatingOccupancyFraction=70 
  23. -XX:SoftRefLRUPolicyMSPerMB=0 
  24. -XX:+PrintClassHistogram  
  25. -XX:+PrintGCDetails  
  26. -XX:+PrintGCTimeStamps  
  27. -XX:+PrintHeapAtGC  
  28. -Xloggc:log/gc.log"; 

64位jdk参考设置,年老代涨得很慢,CMS执行频率变小,CMS没有停滞,也不会有promotion failed问题,内存回收得很干净。

参考:JVM参数调优,无停滞实践

原文链接:http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html

分享到:
评论

相关推荐

    生产环境jvm调优的实例代码-jvm.zip

    生产环境jvm调优的实例代码-jvm

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    深入JVM内核 - 原理、诊断与优化

    介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 baise锁 轻量级锁 自旋锁 介绍JVM中对多线程锁的实现。 第十课 class文件结构 ASM库介绍 介绍JVM规范中的最重要的内容——Class文件...

    JVM实战-JVM类加载机制案例分析

    JVM实战-JVM类加载机制案例分析

    中间件安装调优指导手册

    JVM优化:生产环境参数实例及分析;优化JVM参数提高eclipse运行速度;Tomcat JVM优化一例;linux下Nginx+tomcat整合的安装与配置;Memcached安装;memcache集群配置;JMS安装;JMS集群配置;Nginx反向代理;防火墙...

    JVM优化与OOM分析PPT

    文档中描述java的JVM分析,及OOM问题实例讲解,分析。根据京东项目中的实例进行讲解

    java8源码-jvm-study:jvm-study

    可以看jvm参数查看网址 Direct buffer memory : 直接内存太大(-XX:MaxDirectMemorySize=100m) Java heap space: 堆内存溢出 (-Xms30m -Xmx30m -XX:+PrintGCDetails) GC overhead limit exceeded: gc占用98%的...

    实例分析JVM安全体系双亲委派命名空间保护域策略Java开

    实例分析JVM安全体系双亲委派命名空间保护域策略Java开发Java经验技巧共23页.pdf.zip

    最新java面试专题01-JVM

    程序中的public static void main(String[] args)方法作为JVM实例运行的起点。 垃圾收集:JVM具有自动内存管理和垃圾收集机制,用于自动回收不再使用的对象占用的内存空间。垃圾收集器可以根据不同的算法和策略进行...

    jvm-monitor:一个简单的 JVM 指标监视器

    一个简单的 JVM 统计监视器。 用法:在您的应用程序启动时实例化(例如在ContextLoaderListener ): JvmMonitorLoader loader = new JvmMonitorLoader(); loader.init(1, TimeUnit.SECONDS, new File("/tmp/...

    java范例开发大全

    实例230 查看JVM中所有的线程的活动状况 426 实例231 模仿网络快车下载工具下载文件 428 13.2 多线程的同步与互斥 436 实例232 多线程同步方法的实例 436 实例233 ATM存取一体机(线程同步互斥) 437 实例234 我的钱...

    深入JVM内核—原理、诊断与优化

    资源名称:深入JVM内核—原理、诊断与优化 教程内容:课程简介:第一周初识JVMJVM分类Java语言规范JVM规范介绍JVM的基本知识和发展历史,并介绍了Java语言规范和JVM规范。第二周JVM运行机制简介堆、栈、方法区等JVM...

    java虚拟机调优大师--关于JVM项目程序调优代表性的实例,eclipse优化

    实战:Eclipse运行速度调优。案例分析。高性能硬件上的程序部署策略

    JVM工作原理及内存管理机制

    在执行方法时JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四种指令来执行 (1)invokestatic:调用类的static方法 (2)invokevirtual:调用对象实例的方法 (3)invokeinterface:将属性...

    jvm调优实战经验

    小池塘A(堆内存):JVM运行时数据区域,它为类实例和数组分配的内存。堆可以是固定大小的也可以是可变大小的。其中 Heap = {Old + NEW = { Eden , from, to } }。 小池塘B(非堆内存):包括所有线程之间共享的一个...

    JVM垃圾回收器工作原理及使用实例介绍Java开发Java

    JVM垃圾回收器工作原理及使用实例介绍Java开发Java经验技巧共15页.pdf.zip

    详细讲解了jvm在java中应用

    主要包含:JVM概述,内存结构讲解,对象实例化,垃圾回收,类的加载,程序编译,代码的优化,性能监控与调优. JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二进制字节码的运行环境) 特点:...

    jvm:jvm基础框架

    虚拟机jvm基础框架记录学习内容虚拟机LeetCode算法净额rocketMq实例

    zabbix监控JAVA 进程 JVM数据统计分析告警监控

    zabbix自动发现JAVA进程,并进行自动添加监控JAVA 进程的JVM数据,统计分析告警监控。 支持多种中间件,tomcat、weblogic、微服务方式部署JAVA应用监控。 自带发现脚本和监控脚本,以及zabbix导入模板。

    Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议.zip

    ├─4.04 jvm虚拟机常识-jvm虚拟机参数类型-常用的jvm参数.mp4 ├─4.05 java细腻及讲解-jvm虚拟机常识-常用垃圾回收算法.mp4 ├─4.06 jvm运维实用排障工具.mp4 ├─4.07 jvm运维实用排障工具-jps-jstack.mp4 ├─...

Global site tag (gtag.js) - Google Analytics