随着硬件的不断提升,Java Heap 越来越大,合理的垃圾收集调优变得愈发重要。下面介绍一些最佳实践:

注意:

  1. 下面不涉及 IBM AIX Java. 同时不介绍原理,仅仅是建议以及初始配置/最佳实践,后续如何迭代优化
  2. 需要理解 The Java Virtual Machine Specification  > Run-Time Data Areas 和 Memory Management Whitepaper
  • 配置合适的堆内存大小

    • 通过配置 -Xms -Xmx 设定,分别表示初始和最大值
    • 可以是 4G, 8G, 12G, 16G, 甚至 24G 等等
    • 关于 YOUNG 和 OLD 默认 1:2 的比例 ( -XX:NewRatio ),不太建议一开始就调整,后续结合 GC 检查
  • 垃圾收集优化建议

      • 配置 -XX:+DisableExplicitGC

        • 很多代码里面会有 System.gc() 的调用来触发垃圾收集,带来不必要的负担;该配置会忽略该 API 调用。
      • 选择  GC Policy
        • Java 7 建议默认 - 多线程并行垃圾收集不管 YONG/OLD,线程数是 CPU 个数
        • Java 6 - 默认 YOUNG 多线程并运行,OLD 单线程。建议配置 OLD 多线程并行配置 -XX:+UseParallelOldGC
        • 线程数通过 -XX:ParallelGCThreads 配置,建议值是 CPU 个数除以 JVM 个数
      • 其它 GC 策略
        • Java 6 的 -XX:+UseConcMarkSweepGC,不太建议因为 Java 7 淘汰了; 有 BUG;同时有一个阶段还是会暂停 JVM ,并且特别久 - 6G 的堆可能要几十秒
        • Java 7 以来的 G1 - 没实践过,任何的 GC BUG 都是致命的。
  • 监控 GC 状况
    • 通过配置 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:<path>/gc.log 打印 GC 详细日志
    • 分析 GC 频率
    • 分析 GC 前后内存情况
    • 分析 GC user, sys, real 耗时
    • 比如 - 下面就明确反映操作系统 BUG,在并行 GC 情况下,大约应该是 user / GC线程数 = real
      [GC [PSYoungGen: 6144000K->423839K(7168000K)] 6455356K->735195K(15360000K), 182.4565520 secs] [Times: user=1.71 sys=1454.44, real=182.43 secs]
      --YOUNG GC,共 7168000K 大小,收集前用了 6144000K, 后用了 423839K,共耗时 182.4565520 sec
      [GC [PSYoungGen: 629652K->413103K(7168000K)] 941009K->724459K(15360000K), 116.7165380 secs] [Times: user=1.25 sys=932.20, real=116.70 secs]
      --YOUNG GC,user=1.25 (GC CPU 耗时) sys=932.20 (OS 耗时), real=116.70 secs (总耗时)
      [Full GC [PSYoungGen: 367256K->0K(7495680K)] [ParOldGen: 429715K->699671K(8192000K)] 796972K->699671K(15687680K) [PSPermGen: 126393K->126390K(2097152K)], 558.1420070 secs] [Times: user=2.77 sys=4458.28, real=558.06 secs]
      --FULL GC

Java Performance - 优化和分析Garbage Collection/垃圾收集的更多相关文章

  1. Java Garbage Collection/垃圾收集 策略查看

    Java 的垃圾收集有各种各样的策略,默认的策略也会经常的改变. --比如到底是 serial , parallel, CMS; 具体到 Minor 怎么样,Old 又怎么样? 命令 java -XX ...

  2. garbage collection - 垃圾收集

    Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...

  3. garbage collection - 垃圾收集 生命周期 跟踪内存使用

    Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...

  4. Java Garbage Collection Basics--转载

    原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...

  5. hive impala C++ Java垃圾回收 Garbage Collection GC

    hive impala impala  推荐每个节点内存  2^7~2^8GB Impala与Hive的比较 - 文章 - 伯乐在线 http://blog.jobbole.com/43233/ &l ...

  6. How Garbage Collection Really Works

    Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...

  7. [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)

    source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...

  8. JVM垃圾收集(Java Garbage Collection / Java GC)

    JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...

  9. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

随机推荐

  1. Adam 演示demo内容整理

    在这个6个多G的演示demo中,还是发现了不少东西. 这篇文章八卦向的东西比较多,不过支持abc格式的话,做Cutscene一下子多了很多可以用的东西. 1.在插件目录下发现了ABC格式的导入dll. ...

  2. UICollectionView 使用

    /** 初始化UICollectionView */ UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc ...

  3. jquery post 报404错误

    如果确定页面存在,那很可能是程序执行时报错,可改成get方式来确认一下.

  4. SqlSever基础 dateadd year,增加五年

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  5. 格式化时间(SimpleDateFormat)

    import java.text.SimpleDateFormat; import java.util.Date; public class Main{ public static void main ...

  6. 将文件读取到内存、打印pe结构

    #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h&g ...

  7. FZU 2214 Knapsack problem(背包问题)

    Description 题目描述 Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  8. x名称空间

    XAML代码的WPF程序都需要通过语句:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",x就是用来映射xmlns:x= ...

  9. MySQL数据表生成ER图

    遇到没有说明文档的数据库的时候,一张一张表去分析,需要花费很长时间和精力. 幸好有一些工具,可以帮助我们生成ER图,这样看起来就一目了然: 下面我将自己的一次实践记录于下,供参考: 1.下载并安装工具 ...

  10. git学习笔记11-git多人协作-实际多人怎么开发

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...