`

jvm性能调优理论

阅读更多
1. 关于jvm使用的回收机制
分代回收
将整个堆分为New(年轻代), Tenured(年老代), PermGen(永久代)
其中"年轻代"又分为Eden Space和Survivor1, Survivor2 Space
2. 大概过程
所有新生成的对象存放于Eden Space中,当Eden满无法继续存放时,会进行一次Scavenge
GC(包含清除Eden及整理Survivors space),清除Eden中无用的对象(unreachable),并将尚且存活的对象(reachable)复制到survivor中的正放置对象的那个space,如果此时该space不够空间进行放置,则也会进行一次回收处理,销毁不再使用的对象(释放空间),并且将幸存的对象复制到另外一个空着的survivor space中,且将从Eden中幸存的对象一并放入,注意此时尚有另一机制,该机制会依据jvm参数中设置的次数决定survivor中的对象在survivor两空间中来回复制了多少次后需要被复制到Tenured中,这样保证了生命周期较长对象筛选的严格性(只有经过层层筛选,确实为一个生命周期较长的对象才会被放入"年老代",因为一旦进入年老代,被回收的几率相对于"年轻代"来说就低很多);一旦Tenured中空间不足,则会触发一次Full GC(尽量减少Full GC次数,Full GC会对整个堆进行一次整理,包括New, Tenured, PermGen),对整个堆进行一次整理,销毁无用的对象,释放空间。PermGen也一样,当PermGen满时,会触发一次Full GC,其中PermGen中可能会卸载一些不用的class等元数据。
3. 回收依据算法
    a. 引用计数法
        每次引用该对象与结束引用都会对该对象被引用的数目进行计数,计数为0则作为被回收的依据。
    b. 对象引用遍历
        从最顶端的一组根对象出发,沿着整个对象图上的每条链接,递归确定可到达的对象,如果某个对象不能从这些根结点中的一个到达,则将它作为垃圾回收。(这个过程分为两个步骤:标记+清除---mark+sweep)
4. 调优建议
   a. 尽量将-Xms与-Xmx设为相同,避免内存进行收缩,减小开销。
   b. 对于web服务器项目,多核cpu时使用-XX:+UseParallelGC并行垃圾回收算法,该算法强调吞吐量优先。而并发垃圾回收算法强调的是即时性,垃圾回收时,程序同时运行,适合GUI程序。
   c. 尽量减少Full GC的次数(Full GC时间较长,会让客户请求阻塞),所以程序中避免调用System.gc(),会导致Full GC;
   d. 解释: -XX:NewRatio=4代表年老代与New(年轻代)的比率, Tenured:New=4:1
           -XX:SurvivorRatio=4, Eden:Survivor=4:1, 因为有两个Survivor,所以一个survivor占New空间的1/6;
   e. -XX:ParallelGCThreads=8:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等
   f. -Xmn2g:设置年轻代大小为2G。整个堆内存大小 = 年轻代大小 + 年老代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
   g. -XX:PermSize=256M:设置堆内存持久代 初始值为256M
      -XX:MaxPermSize=512M:设置持久代最大值为512M
     上两项可以设置为一致,避免收缩开销,大小可以设置为峰值大小,外加预留1/3空间
   h. 调优时权衡gc的次数以及每次gc的时间
   i. 年轻代大小选择
    * 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
    * 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
      
      年老代大小选择
    * 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
          o 并发垃圾收集信息
          o 持久代并发收集次数
          o 传统GC信息
          o 花在年轻代和年老代回收上的时间比例
      减少年轻代和年老代花费的时间,一般会提高应用的效率
    * 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

       较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:

    * -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
    * -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
   j. 目标参考: Scavenge GC耗时在10-40ms左右,不应超过300-400ms, Full GC基本不发生(很长时间发生一次),若JVM开启了JMX的话, JMX将会1小时执行一次Full GC以清除引用;

5. 使用jdk自带的工具jconsole配合服务器开启jmx进行观察
    如果遇到内存泄漏,要用jstack和jmap、jstat等多看看,应该可以找到问题
    refer to:http://hi.baidu.com/camaro/blog/item/384b31e9e7bae237b90e2d44.html

6. 基本回收算法

   a. 引用计数(Reference Counting)
      比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。
   b. 标记-清除(Mark-Sweep)
      此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
   c. 复制(Copying)
      此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
   d. 标记-整理(Mark-Compact)
      此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
   e. 增量收集(Incremental Collecting)
      实施垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。
   f. 分代(Generational Collecting)
      基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个,年轻代一般选择"复制",年老代一般选择"标记-清除")进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。



附:
jvm has 3 segments in memory
1. Stack Segment
2. Heap Segment
3. Code Segment
Static members (variables or methods) reside in the Code Segment of the memory.





refer to:
    1. http://blog.csdn.net/kthq/archive/2010/01/11/5180962.aspx
    2. http://dev.firnow.com/course/3_program/java/javajs/20090823/169934.html
    3. http://hxraid.iteye.com/blog/745113
    4. http://unixboy.iteye.com/blog/174173
    5. http://java.sun.com/performance/reference/whitepapers/tuning.html
    6. http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning
    7. http://hi.baidu.com/jchiel/blog/item/bc1f4f17d4f353064b90a739.html
    8. http://blog.csdn.net/chen77716/archive/2010/06/26/5695893.aspx
    9. http://zhdy.iteye.com/blog/343911







分享到:
评论

相关推荐

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

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。...因此,手册的实践操作部分对于开发者来说是作为深入理解和应用JVM性能调优知识的参考。

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

    本视频教程详细讲解了以上内容,并通过实例演示和代码分析,使学习者能够将理论知识应用到实际项目中,提升Java并发编程和JVM性能调优的专业技能。配合提供的"Java高并发编程与JVM性能调优实战 视频教程 下载下载...

    JVM性能调优

    ### JVM性能调优 #### JVM概念与发展历程 ...通过上述的介绍,我们可以看到JVM性能调优不仅需要理论上的知识积累,还需要结合实际应用情况进行综合考虑。在实践中不断学习和摸索,才能真正掌握JVM性能调优的精髓。

    深入虚拟机---JVM调优总结(摘自网上网上大牛分享).pdf

    为了解决这些问题,开发者需要对JVM的运行进行细致的监控和分析,比如使用JVM提供的监控工具和参数来进行性能调优。 最后,在JVM调优的过程中,我们还需要关注内存中的内容分布,如何在堆和栈之间合理分配数据,...

    JVM的调优机制 初始入门

    调优方法包括使用监控工具跟踪JVM性能,识别性能瓶颈,然后调整相关参数或内存结构来优化性能。实践中,可能需要反复测试和调整以达到最佳效果。 9. JVM内存管理 JVM内存管理涵盖了内存区域划分、垃圾回收机制、...

    常用的 JVM 性能调优监控工具,太强大了!.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    JVM调优视频理论及工具

    通过学习JVM调优视频理论及工具,开发者可以深入理解JVM的工作原理,从而有效地解决性能问题,提升Java应用的整体性能。同时,了解和掌握这些工具能帮助开发者更好地定位和解决问题,实现系统的稳定高效运行。

    JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    JVM参数调优及Java测试代码

    在Java开发过程中,JVM(Java Virtual Machine)参数调优是一项关键任务,它直接影响到应用程序的性能、稳定性以及资源消耗。本主题将深入探讨JVM参数调优的重要性、原理以及如何进行测试和监控,以便找到最优配置。...

    jvm调优的实际应用

    《JVM调优实战解析》 ...通过理论学习和实践经验的积累,我们可以更好地理解和优化JVM,从而提高应用的性能和稳定性。在日常工作中,结合监控工具,深入源码,持续学习,是成为一名优秀的Java性能优化专家的必经之路。

    jvm调优实战经验

    在Java开发中,JVM(Java Virtual Machine)的调优是提高应用程序性能的关键环节。JVM调优涉及到对内存管理、垃圾回收机制以及相关参数的调整,以优化应用程序的运行效率和稳定性。本文将深入探讨JVM内存结构及其与...

    阿里巴巴Java性能调优实战(2021华山版).rar

    通过阅读《阿里巴巴Java性能调优实战(2021华山版)》,读者不仅可以掌握Java性能调优的理论知识,还能学习到阿里巴巴在实际业务中总结的宝贵经验,这对于提升个人或团队的开发效率,保障系统稳定性和性能具有极大的...

    JVM基础知识及性能调优.pdf

    在实际工作中,JVM性能调优需要根据应用的需求和特点,通过分析GC日志、监控内存使用、CPU消耗、线程状态等信息,进而调整JVM参数,比如堆内存大小、新生代和老年代的比例、垃圾收集器的选择等,以达到最佳性能。...

    Java性能调优指南.pptx

    Java性能调优是一个涉及多个层面的过程,需要结合理论知识、实践经验以及对JVM和代码的深入理解。通过遵循基本规则,使用正确的工具,编写和运行微基准测试,以及阅读和理解JDK源码,开发者可以有效地提升应用程序的...

    JVM调优实战.doc

    《JVM调优实战》是一份深入探讨Java虚拟机(JVM)性能优化的文档,主要分为理论篇和实战篇两大部分。本文将详细解析其中的关键知识点。 理论篇首先介绍了JVM内存模型,将其比喻为一个多功能的养鱼塘。在这个比喻中...

    JVM调优和故障排除手册

    标题《JVM调优和故障排除手册》预示着文档将专注于Java虚拟机(JVM)的性能调优以及如何诊断和解决在JVM环境中遇到的问题。JVM是运行Java程序的核心,负责提供内存管理、垃圾回收、多线程处理以及本地方法调用等服务...

    Java 性能调优 Java 性能调优 Java 性能调优

    #### 二、性能调优的理论基础 在进行Java性能调优之前,理解几个重要的理论概念是非常必要的: 1. **木桶原理**:一个系统的性能往往取决于最弱的部分。在Java性能调优中,这意味着我们需要找到限制系统性能的瓶颈...

    大数据各类性能调优

    ### 大数据各类性能调优 #### 12.1 配置原则 在大数据环境中,合理配置资源是实现高效能的关键。以下是一些基本原则: **原则1:CPU核数分配原则** - **数据节点**: 建议预留2~4个核心给操作系统和其他进程(如...

    开发常见jvm问题调优.doc

    ### 开发中常见的JVM问题调优 #### 运行时数据区域参数详解 ##### `-Xms` 和 `-Xmx`: 堆起始值与最大值 - **定义**: `-Xms` 设定了JVM堆空间的初始值,而 `-Xmx` 设定了堆空间的最大值。 - **作用**: 这两个参数...

Global site tag (gtag.js) - Google Analytics