`
vern
  • 浏览: 16727 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM1.6 GC详解

 
阅读更多

前言 

JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Collection),可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为 复杂的过程,所以我们要了解JVM内存组成,回收算法,对象分配机制。

 

JVM 堆内存组成

Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区、From区和To区(Survivor)组成。


Eden区用于存放新生成的对象。Eden中的对象生命不会超过一次Minor GC。

Survivor Space  有两个,存放每次垃圾回收后存活的对象,即图的S0和S1。

Old Generation  Old区,也称老生代,主要存放应用程序中生命周期长的存活对象

 

JVM初始分配的内存由-Xms指定,JVM最大分配的内存由-Xmx指定。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限 制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

-XX:NewRatio= 参数可以设置Young与Old的大小比例,-server时默认为1:2,如果太小,会使大对象直接分配到old区去,增大major collections的执行的次数,影响性能。
-XX:SurvivorRatio= 参数可以设置Eden与Survivor的比例,默认为1:8,Survivio大了会浪费,如果小了的话,会使一些大对象在做minor gc时,直接从eden区潜逃到old区,让old区的gc频繁。这个参数保持默认就好了,一般情况下,对性能影响不大。

启动后可通过jmap –heap [pid]查看。
 
由于堆的整体大小是固定的,young generation越大,tenured generation越小,越会增加major collections的执行的次数。所以最佳的选择是由对象的生命周期分布所决定。

 

New区的Collector

 

1、  串行GC(Serial Copying)

     client模式下的默认GC方式,也可使用-XX:+UseSerialGC指定。

2、  并行回收GC(Parallel Scavenge)
     server模式下的默认GC方式,也可用-XX:+UseParallelGC强制指定。

     采用PS时,默认情况下JVM会在运行时动态调整Eden:S0:S1的比例,如果不希望自动调整可以使用-XX:-UseAdaptiveSizePolicy参数,内存分配和回收的算法和串行相同,唯一不同仅在于回收时为多线程。

3、  并行GC(ParNew)

     CMS GC时默认采用,也可以采用-XX:+UseParNewGC指定。内存分配、回收和PS相同,不同的仅在于会收拾会配合CMS做些处理。

 

Old区的几种Collector

1、  串行GC(Serial MSC)

     client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact,非常耗费时间。

2、  并行GC(Parallel MSC)(备注,吞吐量大,但是gc的时候响应很慢)

    server模式下的默认GC方式,也可用-XX:+UseParallelGC=强制指定。可以在选项后加等号来制定并行的线程数。

3、  并发GC(CMS)线上环境采用的GC方式,也就是Realese环境的方式。(备注,响应比并行gc快很多,但是牺牲了一定的吞吐量)

     使用CMS是为了减少GC执行时的停顿时间,垃圾回收线程和应用线程同时执行,可以使用-XX:+UseConcMarkSweepGC=指定使用,后 边接等号指定并发线程数。CMS每次回收只停顿很短的时间,分别在开始的时候(Initial Marking),和中间(Final Marking)的时候,第二次时间略长。具体CMS的过程可以参考相关文档。JStat中将Initial Mark和Remark都统计成了FGC。

CMS一个比较大的问题是碎片和浮动垃圾问题(Floating Gabage)。碎片是由于CMS默认不对内存进行Compact所致,可以通过-XX:+UseCMSCompactAtFullCollection。

 

总体来讲,Old区的大小较大,垃圾回收算法较费时间,导致较长时间的应用线程停止工作,而且需要进行Compact,所以不应该出现较多 Major GC。Major GC的时间常常是Minor GC的几十倍。JVM内存调优的重点,减少Major GC 的次数,因为为Major GC 会暂停程序比较长的时间,如果Major GC 的次数比较多,意味着应用程序的JVM内存参数需要进行调整。

 

JVM内存分配策略

 

1. 对象优先在Eden分配


如果Eden区不足分配对象,会做一个minor gc,回收内存,尝试分配对象,如果依然不足分配,才分配到Old区。


2.大对象直接进入老年代


大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串及数组,虚拟机提供了一个 -XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代中分配。这样做的目的是避免在Eden区及两个 Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。PretenureSizeThreshold参数只对Serial和 ParNew两款收集器有效,

3.长期存活的对象将进入老年代

在经历了多次的Minor GC后仍然存活:在触发了Minor GC后,存活对象被存入Survivor区在经历了多次Minor GC之后,如果仍然存活的话,则该对象被晋升到Old区。
虚拟机既然采用了分代收集的思想来管理内存,那内存回收时就必须能识别哪些对象应当放在新生代,哪些对象应放在老年代中。为了做到这点,虚拟机给每个对象 定义了一个对象年龄(Age)计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并将对象年龄设为1。对象在Survivor区中每熬过一次 Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold来设置。

4.动态对象年龄判定


为了能更好地适应不同程序的内存状况,虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代,如果在 Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到 MaxTenuringThreshold中要求的年龄。


5.Minor GC后Survivor空间不足就直接放入Old区

6.空间分配担保

在发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则改为直接进行一次Full GC。如果小于,则查看HandlePromotionFailure设置是否允许担保失败;如果允许,那只会进行Minor GC;如果不允许,则也要改为进行一次Full GC。大部分情况下都还是会将HandlePromotionFailure开关打开,避免Full GC过于频繁。

 

JVM GC组合方式

 

 

如何监视GC

1.概览监视gc。

   jmap -heap [pid] 查看内存分布

   jstat -gcutil [pid] 1000 每隔1s输出java进程的gc情况

2.详细监视gc。

   在jvm启动参数,加入-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./gc.log。

   输入示例:

  

 [GC [ParNew: 11450951K->1014116K(11673600K), 0.8698830 secs] 27569972K->17943420K(37614976K), 0.8699520 secs] [Times: user=11.28 sys=0.82, real=0.86 secs]

   表示发生一次minor GC,ParNew是新生代的gc算法,11450951K表示eden区的存活对象的内存总和,1014116K表示回收后的存活对象的内存总 和,11673600K是整个eden区的内存总和。0.8699520 secs表示minor gc花费的时间。

   27569972K表示整个heap区的存活对象总和,17943420K表示回收后整个heap区的存活对象总和,37614976K表示整个heap区的内存总和。

[Full GC [Tenured: 27569972K->16569972K(27569972K), 180.2368177 secs] 36614976K->27569972K(37614976K), [Perm : 28671K->28635K(28672K)], 0.2371537 secs]

  表示发生了一次Full GC,整个JVM都停顿了180多秒,输出说明同上。只是Tenured: 27569972K->16569972K(27569972K)表示的是old区,而上面是eden区。

原文:http://www.cnblogs.com/ggjucheng/p/3977384.html

分享到:
评论

相关推荐

    jdk 1.6 gc详解

    在JDK 1.6版本中,GC的优化和选择对于系统的性能至关重要,尤其是在高并发环境中。本文将深入探讨JDK 1.6中的GC工作原理、内存分配策略以及如何进行问题排查和调优。 首先,理解GC的基本概念,其主要任务是识别并...

    06-VIP-JVM调优实战及常量池详解(1)1

    垃圾收集(Garbage Collection, GC)是JVM管理内存的重要机制。GC日志是分析JVM性能的关键工具。通过配置JVM参数,例如 `-XX:+PrintGCDetails`、`-XX:+PrintGCTimeStamps` 和 `-XX:+PrintGCDateStamps`,可以记录...

    06-VIP-JVM调优实战及常量池详解(预习)1

    《JVM调优实战与常量池详解》 在Java开发中,JVM(Java虚拟机)的性能优化是一项至关重要的任务。通过对JVM进行调优,我们可以显著提升应用程序的运行效率,减少内存消耗,避免不必要的垃圾回收(GC)带来的性能...

    JMC_Update_V1.6.rar

    【JMC更新至V1.6版本详解】 Java Mission Control(JMC)是Oracle JDK工具套件中的一个重要组成部分,主要用于高性能、低延迟的应用程序的监控和诊断。此更新的"JMC_Update_V1.6.rar"文件显然包含了JMC的最新升级版...

    jdk1.6文档

    **Java Development Kit (JDK) 1.6详解** JDK 1.6,也被称为Java SE 6,是Java编程语言的一个重要版本,由Oracle公司发布。它为开发者提供了全面的工具和服务,用于开发、调试和运行Java应用程序。这个版本在Java ...

    jdk1.6绿色免安装64位

    **Java Development Kit (JDK) 1.6 绿色免安装64位详解** Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了Java编译器、Java运行时环境(JRE)、开发工具和其他必要的库。JDK 1.6是Oracle公司发布的...

    jdk1.6.0.43/src.zip

    4.垃圾收集器:JDK 1.6引入了多种垃圾收集器,如串行GC、并行GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First),以满足不同场景下的性能需求。 5.安全管理器:Java的安全模型基于安全管理器,它控制哪些操作...

    关键业务系统JVM参数推荐

    #### 三、JVM参数详解 1. **-XX:+PrintFlagsFinal** - 这个参数可以帮助我们查看当前JVM的默认参数设置情况。在进行JVM调优之前,先通过该命令查看当前的参数值,有助于避免重复设置已经默认开启的参数,同时也...

    JDK1.6 32位

    **Java Development Kit (JDK) 1.6 32位详解** JDK(Java Development Kit)是Oracle公司提供的用于开发Java应用程序的核心工具集。它包含了Java编译器、Java虚拟机(JVM)、Java类库以及各种开发和调试工具。JDK ...

    JDK API 1.6&1.8.rar

    **JDK API 1.6&1.8详解** JDK(Java Development Kit)是Java编程语言的核心组件,它是开发和运行Java应用程序的基础。它包含了Java编译器、Java虚拟机(JVM)、调试工具、类库以及相关文档。JDK 1.6和1.8是两个...

    JVM堆模型

    《JVM堆模型详解》 Java虚拟机(JVM)是Java程序运行的核心,而堆内存作为JVM中最大的一块内存区域,对于程序的运行效率和稳定性起着至关重要的作用。本文将深入探讨JVM堆模型,理解其工作原理,以及如何通过优化...

    JVM的垃圾回收算法工作原理详解

    "JVM垃圾回收算法工作原理详解" JVM垃圾回收算法工作原理详解主要介绍了JVM的垃圾回收算法如何判断对象是否可以被回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 JVM垃圾...

    java jvm Jconsole

    ### Java JVM JConsole详解 #### 一、JConsole简介与基本使用 JConsole是一个由Oracle提供的免费工具,作为Java Development Kit (JDK)的一部分被包含其中。它是一个基于Java Management Extensions (JMX)的图形...

    jrockit帮助文档

    《JRockit JVM详解》 Java虚拟机(JVM)是Java程序运行的核心,而Oracle JRockit JVM作为其中的一款高性能、低延迟的虚拟机,为开发者提供了许多独特的特性和优化。JRockit JVM以其出色的内存管理和垃圾回收机制...

    jdk_API_1_6_zh_cn.zip

    《Java JDK API 1.6 中文文档详解》 Java JDK(Java Development Kit)是Java编程语言的核心组件,包含了编译、调试、运行Java应用程序所需的所有工具和库。API(Application Programming Interface)则是开发者...

    JDK开发文档中文版

    此外,JVM(Java Virtual Machine)是运行Java程序的核心,它实现了Java的跨平台特性。 **5. 其他特性** - **泛型**:JDK 1.6 引入了泛型,允许在类型参数化中指定类型,提高了代码的类型安全性和重用性。 - **增强...

    Java虚拟机讲解,欢迎下载

    ### Java虚拟机(JVM)详解 #### Java虚拟机概述 Java虚拟机(JVM)是一种专为执行Java字节码而设计的虚拟计算机环境。它不仅支持Java语言编写的程序,还能运行其他编译为目标字节码的语言如Groovy、Scala等。JVM的...

Global site tag (gtag.js) - Google Analytics