`

JVM系列四:生产环境参数实例及分析

    博客分类:
  • Java
 
阅读更多

java application项目(非web项目)

改进前:

-Xms128m
-Xmx128m
-XX:NewSize=64m
-XX:PermSize=64m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=78
-XX:ThreadStackSize=128
-Xloggc:logs/gc.log
-Dsun.rmi.dgc.server.gcInterval=3600000
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.server.exceptionTrace=true
问题:
  1. permsize 设置较小,很容易达到报警范围(0.8)
  2. 没有设置MaxPermSize,堆增长会带来额外压力。
  3. NewSize较大,old gen 剩余空间64m,一方面可能会带来old区容易增长到报警范围(监控数据显示oldgenused长期在50m左右,接近78%,容易出现full gc),另一方面也存在promontion fail风险
改进后:
-Xms128m
-Xmx128m
-Xmn24m
-XX:PermSize=80m
-XX:MaxPermSize=80m
-Xss256k
-XX:SurvivorRatio=1
-XX:MaxTenuringThreshold=20
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSParallelRemarkEnabled
-XX:CMSFullGCsBeforeCompaction=2
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:logs/gc.log
-Dsun.rmi.dgc.server.gcInterval=3600000
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.server.exceptionTrace=true
修改点:
  1. PermSize与MaxPermSize都设置为80,一方面避免non heap warn(报警阀值0.8 非对内存一般占用到60M以内),一方面避免堆伸缩带来的压力
  2. 通过设置Xmn=24M及SurvivorRatio=1 使得Eden区=from space=to  space=8M,降低了Eden区大小,降低YGC的时间(降低到3-4ms左右),同时通过设MaxTenuringThreshold=20,使得old gen的增长很缓慢。带来的问题是YGC的次数明显提高了很多。
  3. 其他参数优化 修改后带来的好处见JVM参数设置
再次改进后
-Xms128m
-Xmx128m
-Xmn36m
-XX:PermSize=80m
-XX:MaxPermSize=80m
-Xss256k
-XX:SurvivorRatio=1
-XX:MaxTenuringThreshold=20
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=73
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSParallelRemarkEnabled
-XX:CMSFullGCsBeforeCompaction=2
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:logs/gc.log
-Dsun.rmi.dgc.server.gcInterval=3600000
-Dsun.rmi.dgc.client.gcInterval=3600000
-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一点问题都没有,网站没有停顿
$JAVA_ARGS
.=
"
-Dresin.home=$SERVER_ROOT
-server
-Xms6000M
-Xmx6000M
-Xmn500M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-XX:SurvivorRatio=65536
-XX:MaxTenuringThreshold=0
-Xnoclassgc
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:-CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=90
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
";

说明一下, -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秒; 

-Xmx4000M
-Xms4000M
-Xmn600M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-Xss256K
-XX:+DisableExplicitGC
-XX:SurvivorRatio=1
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:LargePageSizeInBytes=128M
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log

改进方案:

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

 

某网友:
$JAVA_ARGS
.=
"
-Dresin.home=$SERVER_ROOT
-server
-Xmx3000M
-Xms3000M
-Xmn600M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-Xss256K
-XX:+DisableExplicitGC
-XX:SurvivorRatio=1
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:LargePageSizeInBytes=128M
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
";
64位jdk参考设置,年老代涨得很慢,CMS执行频率变小,CMS没有停滞,也不会有promotion failed问题,内存回收得很干净
 
参考:
redcreen
 
 
标签: java, jvm
分享到:
评论

相关推荐

    JVM相关的常见面试问题汇总.pdf

    - **JDK (Java Development Kit)**: 包含了JVM、Java标准库以及一系列用于开发Java程序的工具。 - **JVM (Java Virtual Machine)**: 仅指运行Java字节码的虚拟机部分。 - **关系**: JDK = JRE + 开发调试诊断工具; ...

    Weblogic基础管理系列培训之二

    - 启动类型:介绍boot.properties文件、启动参数和不同的启动模式(如开发模式、生产模式)。 - 健康检查:学习监控服务器状态和进行健康检查的方法。 4. **部署应用程序**: - 部署方式:理解手工部署、自动...

    深入java虚拟机

    8. **JVM内存溢出与异常处理**:理解内存溢出错误(如OutofMemoryError)的原因和处理方式,能够帮助开发者及时发现并解决生产环境中的问题。 9. **JVM与多线程**:Java的并发编程离不开对JVM的理解,如线程的创建...

    ibmHeapanalyzer.zip

    只需提供堆转储文件,工具就能进行独立的分析,这为开发者提供了极大的便利,尤其是在无法重现问题现场或不希望影响生产环境的情况下。 使用IBM HeapAnalyzer时,用户首先需要获取堆转储文件。这可以通过设置JVM...

    基于java 的深度学习框架DL4J

    5. **部署应用**: 将训练好的模型部署到生产环境中。 #### 总结 DL4J是一款功能强大的Java深度学习框架,不仅支持高效的模型训练,还提供了完整的生态系统,涵盖了从数据预处理到模型训练再到部署的全流程。无论是...

    最新版windows elasticsearch-7.8.0-windows-x86_64.zip

    3. **JVM参数**:Elasticsearch依赖Java运行环境(JRE),确保系统已安装JDK且版本与Elasticsearch兼容。可以在`jvm.options`文件中调整JVM堆内存大小,如`-Xms`和`-Xmx`。 4. **安全性**:Elasticsearch 7.8.0开始...

    计算机后端-Java-Java高并发从入门到面试教程-存思路.zip

    - **线程不安全的实例**:如`StringBuilder`与`StringBuffer`,以及在并发环境下对静态变量的操作。 - **线程安全类**:如`Atomic*`系列,`Collections.synchronized*`系列。 7. **JVM与并发** - **垃圾回收与...

    Websphere portal tuning调优

    2. **测试环境**:在实际生产环境之前,在模拟真实负载的测试环境中进行充分的测试,确保各项调优措施的有效性。 3. **版本兼容性**:注意检查所使用的软件版本之间的兼容性问题,避免因版本不匹配而导致的问题。 #...

    jdk-7u79-windows-x64

    Java开发工具包(Java Development Kit,简称JDK)是Oracle公司提供的用于开发和运行Java应用程序的...需要注意的是,随着Java版本的更新,旧版本可能不再接受官方支持,因此在生产环境中使用时要考虑兼容性和安全性。

    JAVA开发常识.pdf

    - **部署、发布和维护**:发布产品到生产环境,后续进行持续的监控和维护。 2. **设计模式** 设计模式是软件开发中的最佳实践,是解决常见问题的经验总结。它们遵循如“开-闭原则”(对扩展开放,对修改关闭)、...

    elasticsearch常用版本

    - 安全性提升,集成了X-Pack,提供基础的身份验证、授权、审计和加密功能,为生产环境提供安全保障。 - 6.x版本不再支持动态模板,需要预先定义模板,这有助于提高性能和稳定性。 描述中提到的步骤是下载Elastic...

    jdk1.7 工具

    2. **钻石操作符**:在创建泛型实例时,Java 7允许省略类型参数的显式指定,如`List<String> list = new ArrayList();`,这被称为钻石操作符。 3. **字符串inswitch**:Java 7扩展了switch语句,允许直接在switch中...

    java-appctl.zip_appctl_appctl.sh_java

    5. **环境变量处理**:根据不同的环境(开发、测试、生产)加载不同的配置文件或设置不同的运行参数。 6. **错误处理**:包含异常捕获和处理机制,确保在出现问题时能给出明确的反馈。 综上所述,"java-appctl.zip...

    JAVA上百实例源码以及开源项目源代码

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

    汪文君Java高并发实战编程

    8. **并发性能调优**:分析并发程序的性能瓶颈,如何通过JVM调优参数和监控工具来优化并发性能。 9. **Java内存模型**:阐述Java内存模型(JMM)的概念,理解volatile关键字的作用,以及happens-before原则。 10. ...

    VMwareU2VL经营实战

    - **X86**: 泛指一系列由Intel和AMD生产的兼容处理器架构,是当前个人电脑和服务器中最常见的处理器架构之一。 - **虚拟化**: 将物理资源抽象化为逻辑资源的过程,使得单个硬件可以支持多个独立的操作系统实例。 - *...

    apache-tomcat-8.5.78.tar.gz

    - 调整JVM参数,如堆大小(-Xms, -Xmx)、新生代大小(-XX:NewRatio, -XX:NewSize)等。 - 使用连接池(如Apache Commons DBCP)优化数据库连接。 - 开启压缩和GZIP压缩以减少网络传输。 10. **监控与性能分析**: ...

    Java_GC垃圾回收调优指南

    4. **使用GC日志进行微调**:通过启用GC日志记录(如`-XX:+PrintGCDetails`),可以在生产环境中监控垃圾回收的具体行为,并据此进行更精细的调整。 5. **避免内存泄漏**:定期检查代码中的内存泄漏问题,减少不必...

Global site tag (gtag.js) - Google Analytics