Java Performance - Garbage Collection/垃圾收集

随着硬件的不断提升,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
时间: 2024-08-27 17:29:18

Java Performance - Garbage Collection/垃圾收集的相关文章

Java Garbage Collection/垃圾收集

Java 的垃圾收集有各种各样的策略,默认的策略也会经常的改变. --比如到底是 serial , parallel, CMS; 具体到 Minor 怎么样,Old 又怎么样? 命令 java -XX:+PrintFlagsFinal -version ,提供帮助: bool UseParNewGC = false {product} bool UseParallelGC = false {product} bool UseParallelOldGC = false {product} bool

garbage collection - 垃圾收集

Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected language, meaning that the execution environment is responsible for managing the memory required during code execution. In languages like C and C++, kee

Tuning Java Garbage Collection for Spark Applicati

This is a guest post from our friends in the SSG STO Big Data Technology group at Intel. Join us at the Spark Summit to hear from Intel and other companies deploying Spark in production.  Use the code Databricks20 to receive a 20% discount! Spark is

Java Garbage Collection Basics--转载

原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose This tutorial covers the basics of how Garbage Collection works with the Hotspot JVM. Once you have learned how the garbage collector functions, lear

java 垃圾回收机制和调优(转)Java Garbage Collection

(转)http://www.cnblogs.com/shudonghe/p/3457990.html 文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类. 一.JVM架构 1.HotSpot 架构 HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性.例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架

深入理解Java中的Garbage Collection

前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对HotSpot VM也就是Oracle Hotspot VM或者OpenJDK Hotspot VM,版本为Java8,其他VM不一定适用. 什么是GC(Garbage Collection) Garbage Collection可以翻译为"垃圾收集" -- 一般主观上会认为做法是:找到垃圾,

[Java] 垃圾回收机制 ( Garbage Collection ) 简介

自动垃圾回收( Automatic Garbage Collection ) 自动垃圾回收,是指在堆(Heap)内存上分辨哪些对象还在被使用,哪些对象没有被使用,并清除没有被使用的对象.所以,这里的垃圾实际上是指,在内存中,无法再被使用没有存在的价值的但还占据内存空间的对象. C 语言的内存分配.回收是需要手动完成的,但在 Java 中,回收内存是由垃圾回收器自动完成的. 垃圾回收分为两步骤:1.标记,2.删除.删除垃圾有两种情况,a. 常规删除,b. 带压缩的删除. 第 1 步. 标记 ( M

[Java] 垃圾回收 ( Garbage Collection ) 的步骤演示

关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介 上一篇博客,介绍了堆的内存被分为三个部分:年轻代.老年代.永生代.这篇博文将演示这三个部分如何交互,实际也演示了垃圾回收. 1. 首先,所有新创建的对象都会陪分配到年轻代的 Eden 空间,而两个 survior 空间一开始都为空. 下图表示的是运行一段实际后的年轻代内存情况,新创建的对象会被放在 Eden 空间,"from" survior space 里面的数字

Java finalize以及Garbage Collection

Java的垃圾回收机制: Java的垃圾回收并不等于C++中的析构.Java中,只有在程序濒临存储空间用完的那一刻,对象占用的空间才会释放.所以,在JAVA程序中,我们通常只考虑创建对象,而从不关心对象的清除.这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,那就不用支付这部分开销了. 什么情况下我们需要finalize(): 有了垃圾回收,我们一般不需要关心对象空间的释放,但在一些特殊的内存区域,需要我们手动清除. 特殊的内存区域是指在分配内存时,如果一个对象正在处理的是非Java 资