`
shenhaiyue
  • 浏览: 25989 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM参数调优技巧

    博客分类:
  • java
 
阅读更多
JVM参数调优实例解析

关于JVM参数调优,对于很多程序员来说都是很头痛的问题,如果设置的不好,JVM不断执行FullGC,将导致整个系统变得很慢,网站停滞时间能达10秒以上,这种情况如果没隔几分钟就来一次,自己都受不了。

这种停滞在测试的时候看不出来,只有网站pv达到数十万/天的时候问题就暴露出来了,要想配置好JVM参数,需要对年轻代、年老代、救助空间和永久代有一定了解,还要了解JVM内存管理逻辑,最终还要根据自己的应用来做调整。关于JVM参数上网一搜就能搜出一大把,也有很多提供实践的例子,我也按照各种例子测试过,最终还是会出现问题,经过几个月的实践改善,我就网站(要求无停滞时间)的jvm参数调优给出以下几条经验。

1:建议用64位操作系统,Linux下64位的JDK比32位JDK要慢一些,但是吃得内存更多,吞吐量更大。

2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。

3:调试的时候设置一些打印参数,如-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-Xloggc:log/gc.log,这样可以从gc.log里看出一些端倪出来。

4:系统停顿的时候可能是GC的问题也可能是程序的问题,多用Jmap和Jstack查看,或者killall-3Java,然后查看Java控制台日志,能看出很多问题。有一次,网站突然很慢,Jstack一看,原来是自己写的URLConnection连接太多没有释放,改一下程序就OK了。

5:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。

6:垃圾回收时PromotionFailed是个很头痛的问题,一般可能是两种原因产生,第一个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要放入救助空间;第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向FullGC,网站停顿时间较长。第一个原因我的最终解决办法是去掉救助空间,设置-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0即可,第二个原因我的解决办法是设置CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接纳来自年轻代的对象。

7:不管怎样,永久代还是会逐渐变满,所以隔三差五重起Java服务器是必要的,我每天都自动重起。

8:采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿,我的最终配置如下(系统8G内存),每天几百万PV一点问题都没有,网站没有停顿,2009年网站没有因为内存问题down过机。

$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

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

SoftRefLRUPolicyMSPerMB

这个参数我认为可能有点用,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.

Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我觉得没必要等1秒;

网上其他介绍JVM参数的也比较多,估计其中大部分是没有遇到PromotionFailed,或者访问量太小没有机会遇到,(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn这个公式绝对是原创,真遇到PromotionFailed了,还得这么处理。
分享到:
评论

相关推荐

    jvm参数调优-jvmSample.zip

    因此,掌握JVM参数调优技巧是每个Java开发者必备的技能。本文将深入探讨JVM参数的设置方法,并结合实例"jvmSample-master"进行分析。 一、JVM概述 1. 类加载机制:JVM通过类加载器将字节码加载到内存中,分为启动...

    jvm工具、参数调优&调试技巧

    JVM参数调优是提高程序性能的重要手段,主要包括以下几方面: 1. 内存设置:-Xms和-Xmx分别设定堆内存的初始大小和最大值,-XX:NewRatio控制新生代与老年代的比例,-XX:SurvivorRatio则定义新生代中Eden区与...

    JVM性能调优总结.docx

    本文将总结JVM性能调优的经验和技巧,并提供一些实用的配置参数和建议。 一、堆大小设置 堆大小是JVM性能调优中的一个关键参数。堆大小的设置直接影响到系统的性能和稳定性。堆大小有三方面限制:相关操作系统的...

    JVM调优技巧

    JVM深入理解,JVM调优技巧

    Java性能优化指南:JVM调优技巧与实践

    通过合理配置JVM参数和采用一些调优技巧,开发者可以显著提高应用程序的性能。本文将探讨一些常用的JVM性能调优技巧,并提供代码示例来展示这些技巧的应用。 JVM性能调优是一个多方面的任务,涉及JVM配置、垃圾回收...

    个人总结之—JVM性能调优实战

    ### 个人总结之—JVM性能调优实战 #### 概述 本文档是一篇关于JVM(Java虚拟机)性能调优的经典实战总结。...在实际工作中,还需要结合具体应用场景灵活运用这些调优技巧,持续不断地进行性能优化。

    JAVA JVM性能调优监控工具详解

    ### JAVA JVM性能调优监控工具详解 在Java开发过程中,特别是在企业级应用中,经常会遇到各种性能瓶颈问题,如内存溢出(`OutOfMemoryError`)、内存泄露、线程死锁、锁争用等问题。这些问题如果不能及时有效地解决...

    JVM系列之性能调优参考手册(实践篇).pdf

    性能调优不仅需要了解JVM参数,还需要关注参数的具体含义和应用。例如,“-Xms”和“-Xmx”分别用于设置JVM的初始堆内存和最大堆内存,“-Xss”用于设置线程堆栈大小,“-Xmn”用于设置年轻代内存大小。而“-XX”...

    JVM性能调优经典教程

    3. **JVM参数调整**:通过设置JVM启动参数,可以定制JVM的行为。比如,`-Xms`和`-Xmx`用于设置堆内存的初始大小和最大大小,`-XX:NewRatio`定义新生代与老年代的比例,`-XX:+UseConcMarkSweepGC`启用并发标记扫描...

    马士兵jvm调优笔记.docx

    为了更好地控制Java虚拟机的行为,可以设置一系列JVM参数来优化性能。这些参数可以分为几类: - **标准参数**:所有JVM实现都支持的标准配置选项。 - **非标参数(-X)**:某些特定JVM实现提供的扩展配置选项。 - *...

    jvm工具、参数调优&调试技巧(补充+修正版)

    二、JVM参数调优 1. -Xms与-Xmx:设置JVM堆内存的初始大小和最大大小,确保应用程序有足够的内存空间运行。 2. -XX:NewRatio:调整新生代与老年代的比例,影响垃圾收集策略。 3. -XX:SurvivorRatio:设定新生代中...

    JVM调优实战

    JVM调优实战 介绍JVM调优的技巧相关参数的设置等等

    monkey老师的jvm 调优

    Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理及其优化技巧。下面,我们就一起来深入学习Monkey老师关于JVM调优的核心知识点。 首先,我们要明白JVM的重要性。它是Java程序...

    jvm工具、参数调优&调试技巧.doc

    了解并掌握JVM工具和参数调优技巧,可以帮助我们提升应用程序的性能,减少内存泄漏,优化资源利用,以及解决运行时问题。以下将详细介绍相关知识点。 一、JVM工具 1. **jps(Java Virtual Machine Process Status ...

    用于测试jvm gc调优-share-jvm-gc.zip

    1. **JVM参数设置**:根据应用需求,设置合适的JVM启动参数,如堆大小(`-Xms`和`-Xmx`)、新生代与老年代的比例(`-XX:NewRatio`)、Eden区与Survivor区的比例(`-XX:SurvivorRatio`)、GC日志输出(`-XX:+...

    Java高并发编程与JVM性能调优实战 视频教程 下载下载因为太大存百度云盘3.zip

    4. **JVM参数调优**:深入研究如何设置堆大小、新生代与老年代比例、GC策略等关键参数,以优化程序性能。 5. **类加载机制**:了解类加载器的工作原理,包括双亲委派模型和类的生命周期。 6. **编译优化**:探讨...

    Java高并发编程与JVM性能调优实战 视频教程 下载下载因为太大存百度云盘2.zip

    5. **JVM参数调优实践**:如何设置Xms、Xmx、XX:NewRatio、XX:SurvivorRatio、XX:MaxHeapFreeRatio等关键参数,以优化应用启动速度和运行性能。 6. **代码级别的性能优化**:包括避免过度的对象创建、减少同步开销...

    JVM 1.42调优中文文档

    文档强调了正确选择和调整JVM参数的重要性,尤其是对于大型、多线程和高内存需求的应用。默认的垃圾收集器可能适用于大多数场景,但在特定条件下,如高并发、大规模数据处理,可能需要定制化的配置来提升性能。 7....

Global site tag (gtag.js) - Google Analytics