Hotspot的三种GC算法

原创 2016年05月30日 21:47:15

JVM内存分代图示

   

   

   

   

  1. Serial Collector
  • 是JVM在client模式下的默认GC方式,通过JVM参数 -XX:UseSerialGC 来指定。
  • 当Eden空间不足时,触发Minor GC,会先检查之前每次Minor GC晋升到Old区的对象的平均大小,如果Old区的剩余空间小于平均大小,则直接触发Full GC,如果Old区的剩余空间大于平均大小,则看HandlePromotionFailure(-XX:-HandlePromotionFailure)的值。如果为true,仅触发Minor GC,否则再触发一次Full GC。
  • -XX:MaxtenuringThreshold=10(经过10次Minor GC回收,放入Old区)
  • 当Survivor区中的To Space放不下这些对象时,这些对象被放入Old区,如果Old或Perm区空间不足,将会触发Full GC。
  • JVM的GC操作是串行的,JVM中的其他应用程序会全部停止。

       

  1. Parallel Collector

    parallel GC根据Minor GC和Full GC的不同分为三种,分别是ParNewGCParallelGCParallelOldGC

       

  2. ParNewGC
  • 通过-XX:UseParNewGC指定。回收策略与Serial Collector相似,只是回收不是单线程的,而是多线程并行回收
  • Parallel Collector有一个UseAdaptIvePolicy配置参数,用来动态控制Eden,From Space,To Space的TenuringThreshold的大小。

       

  1. ParallelGC
  • Server下默认的GC方式。可以通过-XX:+UseParallelGC参数来强制指定。
  • 并行回收的线程数可以通过-XX:ParallelGCThreads来指定。这个值有个计算公式,如果CPU核心数小于8,线程数可以和核心数一样,如果大于8,值为3+(cpu core*5)/8
  • 可以通过-Xmn来控制young区的大小。
  • young区内的Eden,From Space,To Space的大小通过SuriviorRatio控制,(-XX:SuriviorRadio=8表示Eden与From Space的大小为8:1)。但是默认情况下是通过-XX:initalSuriviorRadio的设置为准,默认为8。
  • 当在Eden中申请内存发生不够的情况时,看当前申请的空间是否大于Eden的一半,如果大于则直接在Old区中分配空间,如果小于则触发Minor GC。
  • 触发Minor GC前会检查过去每次晋升Old区的平均大小是否大于Old区的剩余空间。如果大于则再次触发Full GC,在这次触发后仍会按这个规则重新检查一次,Full GC会执行两次。
  • AlwaysTenure,默认为false,表示Minor GC后存活就晋升到Old区。
  • NeverTenure,默认为false,表示永远晋升到Old区。
  • 如果上面两个值都没有设置的情况下设置UseAdaptIveSizePolicy,启动时以InitialTenuringThresHold值作为存活次数的阈值,在每次GC后会动态调整。
  • 如果不使用UseAdaptIveSizePolicy,则以MaxTenuringThresHold为准。不使用UseAdaptIveSizePolicy则设置参数为-XX:-UseAdaptiveSizePolicy
  • 当Old或Perm区空间不足时,会触发Full GC,如果设置了参数ScavengeBeforeFullGC,在Full GC之前会触发Minor GC。

       

  1. ParallelOldGC
  • 可以使用-XX:+UseParallelOldGC来强制指定。
  • 通过-XX:ParallelGCThreads来指定并行回收的线程数。如果CPU核心数小于8,线程数与核心数一致,大于8则值为3+(cpu core*5)/8
  • 与ParalelGC不同之处在于Full GC。Parallel GC的Full GC清空整个Heap堆中的垃圾对象,清除Perm区中已被卸载的类信息,并进行压缩。而ParallelOldGC清除Heap堆中的部分垃圾对象,并进行部分的空间压缩。
  • GC程序是多线程,当同样暂停其他所有程序。

       

  1. CMS Collector
  • 使用-XX:+UseConcMarkSweepGC来指定。
  • 并发的线程数默认为4(并行GC线程数+3),也可以通过ParallelCMSThreads指定。
  • 既不是Minor GC,也不是Full GC,是基于两种GC之间的一种GC。触发规则是检查Old区或Prem区的使用率。
  • Old区默认达到92%就回收空间,可以通过CMSInitiaingOccupancyFraction参数来指定比例 。这个默认值是通过((100-MinHeapFreeRadio)+(double)( CMSTriggerRadio*MinHeapFreeRadio )/100.0)/100.0计算出来的。其中MinHeapRadio为40,CMSTriggerRadio为80。
  • 如果让Prem也使用CMS GC,可以通过-XX:+CMSClassUnloadingEnabled来设定。默认比例值也是92%。可以通过CMSInitiaingPremOccupancyFraction参数指定比例。这个默认值是通过((100-MinHeapFreeRadio)+(double)(CMSTriggerPermRadio*MinHeapFreeRadio)/100.0)/100.0计算出来的。其中MinHeapFreeRadio为40,CMSTriggerPermRadio为80
  • 触发CMS GC回收的只是Old区或Perm区的垃圾对象。与Minor GC或Full GC没有关系。
  • 这种模式下的Minor GC触发与回收规则与Serial GC基本一致。不同之处只是GC回收变成多线程而已。
  • 有两种情况触发Full GC。一种是Eden分配失败,Minor GC后分配到To Space,To Space不够再分配到Old区,Old区不够则触发Full GC。另外一种情况是,当CMS GC正在进行时先Old区申请内存失败,则会直接触发Full GC。
  • 在HotSpot 1.6中使用这种GC方式时,需要在程序中显示调用System.gc
  • CMS GC触发时机会动态调整,禁止JVM自行触发CMS GC,可以通过配置参数-XX:+UseCMSInitiatingOccupancyOnly来实现。

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JVM gc参数设置与分析

原文: http://hi.baidu.com/i1see1you/item/295c1dc81f91ab55bdef69e5gc日志分析工具: http://qa.blog.163.com/b...
  • yohoph
  • yohoph
  • 2014-12-20 11:47
  • 20354

GC的三大基础算法

1. 垃圾(Garbage) 就是需要回收的对象。 作为编写程序的人,是可以做出“这个对象已经不再需要了”这样的判断,但计算机是做不到的。因此,如果程序(通过某个变量等等)可能会直接或...

java虚拟机HotSpot 的 GC 算法实现

在HotSpot虚拟机上实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行
  • canot
  • canot
  • 2016-04-03 13:26
  • 977

触发JVM进行Full GC的情况及应对策略

Full GC又称作Major GC,属于老年代GC,指发生在老年代的GC,相对这种GC的有新生代GC即Minor GC。出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的,Maj...

JVM 垃圾回收(GC)和HotSpot算法实现

JVM GC主要针对的是Java堆和方法区 如何判断对象已死: 可达性分析算法(Reachability Analysis):通过一系列的称为“GC Roots”的对象作为起点,从对象节点开始向下...

HotSpot GC

按代的垃圾收集机制, 主要分为三种: 复制算法,空间被分为等大的两块,从根开始访问每一个关联的活跃对象,将空间 A 的活跃对象全部复制到空间 B,然后一次性回收整个空间 A,优点:只访问活跃对象,将所...

HotSpot VM GC 的种类

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037029.html collector种类       GC在 H...

【JVM】HotSpot JVM内存管理和GC策略总结

hotspot jvm内存模型 1.内存模型 hotspot的内存模型很多地方都有类似总结,我也简单总结了一下,大概可以用下图表示:  关于几个分区的描述定义 1.线程栈:线程创建是会...

JVM内存模型以及HotSpot的GC策略

本文描述了JVM的内存模型定义、Java自动内存管理概念、以及Oracle官方虚拟机HotSpot在内存管理方面的实现。

HotSpot GC 具体实现关键点概要

HotSpot GC 具体实现关键点概要GC roots 枚举过程枚举过程的困难点: 范围大: GC roots主要在全局性的引用(常量与静态变量)和执行上下文(如栈帧中的本地变量表)。现在程序仅仅就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)