`
boy00fly
  • 浏览: 194701 次
  • 性别: 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  
一直关注楼主的文章。。。。。

相关推荐

    第6节: GC垃圾回收-02

    第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC垃圾回收-02第6节: GC...

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

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

    JAVA gc日志分析工具GChisto及CMS GC补丁

    GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...

    JAVA面试题垃圾收集机制

    触发Young GC:当新生代中的Eden区没有足够空间进行分配时会触发Young GC。 触发Full GC: 当准备要触发一次Young GC时,如果发现统计数据说之前Young GC的平均晋升大小比目前老年代剩余的空间大,则不会触发Young...

    JVM:GC机制

    如果你对jvm没有基本的了解,那么你可以先了解jvm之后再参阅本人会更便于理解 ...GCRoot:就是指当前仍在直接引用的对象,GCRoot对象所引用的全部对象会形成一个GCRoot链 new对象 Eden区满之后会通过Minor GC机制

    GC9503V-DS IC规格书

    内容:GC9503V_DS IC规格书 适合:嵌入式开发人群,点屏过程中或者编写显示驱动时参考。

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

    什么是GC,GC是什么意思为什么要有GC,了解gc对内存的处理机制

    GC算法:GC算法

    GC算法笔记

    仪器分析:GC的固定相-气—液色谱固定相.pptx

    仪器分析

    infobase:GC InfoBase的源代码GC InfoBase的源代码

    (法兰西西服)GC InfoBase单仓库GC InfoBase是一种交互式的数据可视化工具,可将复杂的联邦数据转换为适用于加拿大人的简单视觉故事。 自2013年成立以来,GC InfoBase被国会预算官员(PBO)确认为政府支出信息的...

    GCsnap:GC快照

    GC快照 GCsnap是一个灵活的基于Python的工具,它允许在任何分类学水平上交互比较来自任何基因组的蛋白质编码基因的基因组背景,并将它们与所示任何基因的功能和结构信息整合在一起。 通过将输出连接到不同的蛋白质...

    Jvm1.8_GC.mmap

    Minor GC:年轻代垃圾回收,所有的Majar GC都会触发进程暂停,只是这个实际很短 Major GC:也叫Full GC,年老代垃圾回收 年轻代和年老代的GC策略是不一样的,年轻代一般采用的是复制算法。 Minor GC和...

    c#的GC垃圾回收机制详细讲解文档

    今天来谈谈C#的GC,也就是垃圾回收机制,非常的受教,总结如下 首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是...

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    自己的系统的gc参数学习

    这个是垃圾收集器的系统gc log,学习可以参考。这个是垃圾收集器的系统gc log,学习可以参考。

    gc_tracer:添加GC

    GC :: Tracer 跟踪垃圾收集器的活动并输出统计信息。 该宝石仅支持MRI 2.1.0及更高版本。 安装 将此行添加到您的应用程序的Gemfile中: gem 'gc_tracer' 然后执行: $ bundle 或将其自己安装为: $ gem install...

    格科微GS8604 GC0308 GC0339GC2035GC6123等摄像头传感器芯片(30个)数据手册设计指南等资料.zip

    格科微GS8604 GC0308 GC0339GC2035GC6123等摄像头传感器芯片(30个)数据手册设计指南等资料,型号如下: GC0112 GC0308 GC0309 GC030A GC0310 GC0311 GC0312 GC0313 GC0328 GC0329 GC0339 GC0406 GC0409 GC2015 GC...

Global site tag (gtag.js) - Google Analytics