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

自己动手写写:GC何时触发?

    博客分类:
  • JVM
阅读更多

本文是基于Oracle的Hotspot JVM 1.6版本的分析。

 

先来看一下 HotSpot的内存结构:

 

 

备注:在HotSpot中本地方法栈和JVM方法栈是同一个,因此也可以用-Xss控制。


经IBM研究,通常运行的程序有80%--98%的对象是临时对象,因此Hotspot对JVM堆采用了分代的方式来管理,以提升GC的效率。

 

下面我们来看一张堆内存逻辑划分图:


 

分为New Generation或Young Generation(包含Eden Space、S0、S1)、Old GenerationPermanent Generation

 

备注:New Generation中大部分为临时对象,因此采用了复制算法进行实现。通常将对New Generation进行的回收称为Minor GC;对Old Generation进行的回收称为Major GC 但由于Major GC除并发GC外均需对整个堆以及Permanent Generation进行扫描和回收,因此又称为Full GC。

其中Permanent Generation主要存储了class的信息,详细可参考:

        http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

不过在jdk7中此区域要被移除了。

 

下面紧接着的一个问题就是何时进行Minor GC、何时进行Major GC?

结合上图我们来简单的描述下回收的过程:

 

  1. 对象在Eden Space完成内存分配
  2. 当Eden Space满了,再创建对象,会因为申请不到空间,触发Minor GC,进行New(Eden + S0 或 Eden S1) Generation进行垃圾回收
  3. Minor GC时,Eden Space不能被回收的对象被放入到空的Survivor(S0或S1,Eden肯定会被清空),另一个Survivor里不能被GC回收的对象也会被放入这个Survivor,始终保证一个Survivor是空的
  4. 在Step3时,如果发现Survivor区满了,则这些对象被copy到old区,或者Survivor并没有满,但是有些对象已经足够Old,也被放入Old Space。
  5. 当Old Space被放满之后,进行Full GC

 

 

但这个具体还要看JVM是采用的哪种GC方案!

 

New Generation的GC有以下三种:


 

对于上述三种GC方案均是在Eden Space分配不下时,触发GC.

 

Old Generation的GC有以下四种:


 

对于Serial MSC, Parallel MSC, Parallel Compacting而言触发机制为

 

  • Old Generation空间不足
  • Permanent Generation空间不足
  • Minor GC时的悲观策略
  • Minor GC后在Eden上分配内存仍然失败
  • 执行Heap Dump时
  • 外部调用System.gc,可通过-XX:+DisableExplicitGC来禁止
对于CMS而言触发机制为:
  • 当Old Generation空间使用到一定比率时触发;HopSpot V1.6中默认是92%,可通过PrintCMSInitiationStatistics(此参数在V1.5中不能用)来查看这个值到底是多少;可通过CMSInitiatingOccupancyFaction来强制指定,默认值并不是复制在这个值上,是根据如下公式计算出来的:((100 -MinHeapFreeRatio) +(double)(CMSTriggerRatio* MinHeapFreeRatio) / 100.0)/ 100.0;MinHeapFreeRatio默认值:40 CMSTriggerRatio默认值:80
  • 当Permanent Generation采用CMS收集且空间使用到一定比率触发;Permanent Generation采用CMS收集需设置:-XX:+CMSClassUnloadingEnabled Hotspot V1.6中默认为92%;可通过CMSInitiatingPermOccupancyFraction来强制指定,同样,它是根据如下公式计算出来的:((100 -MinHeapFreeRatio) +(double)(CMSTriggerPermRatio* MinHeapFreeRatio) / 100.0)/ 100.0;MinHeapFreeRatio默认值:40 CMSTriggerPermRatio默认值:80
  • Hotspot根据成本计算决定是否需要执行CMS  GC;可通过-XX:+UseCmsInitiatingOccupancyOnly来去掉这个动态执行的策略。
  • 外部调用System.gc,且设置了ExplicitGCIInvokesConcurrent;需要注意,在hotspot 6中,在这种情况下如果应用同时使用了NIO,可能会出现bug。

 

备注:关于究竟采用何种GC方案,在后续JVM调优的章节中再详细阐述。

  • 大小: 49.8 KB
  • 大小: 3.2 KB
  • 大小: 4.3 KB
  • 大小: 5.7 KB
2
4
分享到:
评论
2 楼 boy00fly 2011-07-21  
trunk 写道
一直关注楼主的文章。。。。。

   谢谢。
1 楼 trunk 2011-07-20  
一直关注楼主的文章。。。。。

相关推荐

    gc2053 datasheet

    GC2053数据表 GC2053是一款CMOS图像传感器,主要应用于图像采集和处理领域。下面是对GC2053数据表的详细分析和知识点总结: Sensor Overview: GC2053是一款1/2.9英寸的CMOS图像传感器,具有高达2Mega像素的...

    什么是GC,GC是什么意思为什么要有GC

    垃圾回收(GC)机制详解 在计算机科学中,垃圾回收(Garbage Collection,简称GC)是一种自动内存管理机制,它可以帮助开发者更好地管理内存资源,避免内存泄露和溢出。GC的主要作用是追踪和回收不再使用的对象,...

    VM调优实战指南:GC与性能优化

    ### VM调优实战指南:GC与性能优化 #### 一、GC调优 **1. 理解GC** GC(Garbage Collection),即垃圾收集,是Java虚拟机(JVM)的一项关键特性,用于自动回收不再使用的对象所占用的内存空间,防止内存泄漏的发生...

    gc02m1 datasheet

    GC02M1 datasheet GC02M1是一款CMOS图像传感器,具有高分辨率、低噪声和高灵敏度等特点。下面是根据GC02M1 datasheet的内容生成的相关知识点: 1. 传感器概述 GC02M1是一款1/5英寸的CMOS图像传感器,具有200万像素...

    camera datasheet :gc2053/gc2093/gc2145/gc4653/gc4663

    本资料包包含了关于一系列摄像头传感器的详细技术信息,特别是gc2053、gc2093、gc2145、gc4653以及gc4663这五款型号。这些数据表通常会涵盖以下关键知识点: 1. **产品概述**:每个型号的传感器都会有其独特的功能...

    第6节: GC垃圾回收-02

    如果老年代空间不足,JVM会触发Full GC。 ### **垃圾收集器** 1. **Serial收集器**:单线程,适用于小型应用或低配环境。 2. **Serial Old收集器**:Serial收集器的老年代版本,单线程标记-整理算法。 3. **ParNew...

    冯连森:5GC典型信令流程.pdf

    冯连森:5GC典型信令流程.pdf冯连森:5GC典型信令流程.pdf冯连森:5GC典型信令流程.pdf冯连森:5GC典型信令流程.pdf冯连森:5GC典型信令流程.pdf

    GC9503W DataSheet V1.7.pdf

    GC9503W Datasheet V1.7 GC9503W 是一款基于 a-Si TFT LCD 的单芯片驱动器,具有 480(RGB)x960 的分辨率和 16.7M 色彩输出能力。该芯片不具有 internal GRAM。 GC9503W 的主要特点包括: * 高分辨率: GC9503W ...

    GC0308应用手册.pdf

    ### GC0308 应用手册知识点解析 #### 一、概述 GC0308是一款由格科微电子有限公司开发的VGACMOS图像传感器芯片,具有高性价比的特点,适用于多种拍照解决方案。该手册提供了对GC0308芯片在寄存器配置和系统应用方面...

    摄像头GC0328

    GC0328是一款由Galaxy Core公司生产的1/6.5英寸VGACMOS图像传感器,具有高分辨率和良好的成像性能,特别适用于移动设备和电子产品的摄像头应用。 传感器概述: GC0328拥有640x480像素的分辨率和1/6.5英寸的光学格式...

    GCViewer-FullGC分析工具

    《GCViewer:全面解析Java程序Full GC分析工具》 在Java世界中,垃圾收集(Garbage Collection, GC)是管理内存的重要机制。然而,当GC运行频繁或出现长时间的Full GC时,可能会导致应用程序性能下降,甚至出现暂停...

    自己的系统的gc参数学习

    在Java世界中,垃圾收集(Garbage Collection, GC)是一项至关重要的任务,它负责自动管理内存,释放不再使用的对象以防止内存泄漏。本教程将深入探讨GC参数的学习,特别是针对G1垃圾收集器的系统配置。 一、垃圾...

    gcviewer.rar

    《GCViewer:深入理解Java垃圾收集的利器》 在Java编程世界中,内存管理是至关重要的,特别是垃圾收集(Garbage Collection, GC)机制,它负责自动清理不再使用的对象,以避免内存泄漏。GCViewer正是这样一款强大的...

    摄像头gc2145资料.rar

    摄像头GC2145是一种常见的数字摄像头芯片,广泛应用于各种监控设备、网络摄像头以及电脑摄像头等产品中。本文将深入探讨GC2145的核心知识点,包括寄存器初始化配置和数据手册,以及如何利用C语言进行编程。 一、GC...

    摄像头 gc2385 代码 调试

    针对“摄像头gc2385代码调试”这个主题,我们主要关注的是MTK6739平台上的摄像头传感器GC2385的驱动程序开发与调试。MTK6739是由联发科(Mediatek)制造的一款四核处理器,常用于入门级和中低端智能手机,而GC2385则...

    GC9503V-DS IC规格书

    《GC9503V-DS IC规格书》是一份重要的技术文档,主要面向嵌入式开发领域的工程师,尤其在进行点屏操作或编写显示驱动程序时,此规格书是不可或缺的参考资料。嵌入式系统通常涉及到硬件和软件的紧密集成,其中显示...

    GC算法:GC算法

    GC的性能优化是另一个重要的话题,包括调整GC的触发时机、减少暂停时间(Stop-the-world)以及并行和并发GC等。在多线程环境下,如何实现安全的并发GC,避免数据竞争,也是GC设计的一大挑战。 总的来说,GC算法在...

Global site tag (gtag.js) - Google Analytics