minor GC 、 full GC、新生代(young )、老年代(old)的一些理解

  • Post author:
  • Post category:其他




Minor GC

Minor GC是俗称,新生代(新生代分为一个 Eden区和两个Survivor区)的垃圾收集叫做 Minor GC。 清除 Eden 和 from ,转到to中。接下来from与to转换。继续清除 Eden和新from,转到to。清除一次后存活超过年龄的 ,转到老年代。to到了阈值后,部分对象转到老年代。

晋升老年代参数:

XX:+MaxTenuringThreshold

(至于为什么是 15次,原因是 HotSpot会在对象头的中的标记字段里记录年龄,分配到的空间只有4位,所以最多只能记录到15)

另外,如果单个 Survivor 区已经被占用了 50% (对应虚拟机参数:

-XX:TargetSurvivorRatio

),那么较高复制次数的对象也会被晋升至老年代。

Full GC 就是收集整个堆,包括新生代,老年代,永久代(在JDK 1.8及以后,永久代会被移除,换为metaspace)等收集所有部分的模式。



新生代老年代比例

默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数

–XX:NewRatio

来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。

老年代 ( Old ) = 2/3 的堆空间大小



新生代(young generation)

Eden、survivor(from+to),Eden:From:To=8:1:1( 可以通过参数 –XX:SurvivorRatio 来设定 ),即:Eden = 8/10 的新生代空间大小,From = To = 1/10 的新生代空间大小。 新生对象在Eden和from中,minor gc后,转到to或者老年代。一次minor gc后,from与to角色互转。

新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。

来自

https://blog.csdn.net/Muyundefeng/article/details/72667863



老年代(old generation):存有大对象或者 超过阈值的对象晋升来。


-XX:PretenureSizeThreshold 参数 ,大于这个数量直接在老年代分配,缺省为0 ,表示绝不会直接分配在老年代


【来自】java堆,新生代,老年代,Eden空间,From Survivor空间,To Survivor空间


堆的内存模型大致为:
在这里插入图片描述

默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。

老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。

默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。

JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。


java堆,新生代,老年代,Eden空间,From Survivor空间,To Survivor空间



JVM 系列文章之 Full GC 和 Minor GC



版权声明:本文为thewindkee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。