CMS和G1

 
Concurrent Mark Sweept CMS
启用方式:-XX:+UseConcMarkSweepGC,表示年老代使用此机制收回
基础算法:标记-清除
回收过程:
1、初始标记(STW stop the world),扫描能够和“根对象”直接关系的对象,并作标记。时间快;
2、并发标记
3、并发预清理,处理“并发标记”的对象(可能会有一些新的对象晋升到老年代),减少下一阶段(SWT)
4、重新标记 扫描剩余对象。从“跟对象”开始向下追溯,并处理对象并联
5、并发清理
6、并发重置
 
缺点:
  由于采用Mark-Sweep,所以CMS不会整理、压缩堆空间。
  需要更多的CPU资源
  需要更大的空间,百分之68就开始行动了。
 
Garbage First (G1) 保留了CMS关于代的概念,但是不是物理上连续区域,而是一个逻辑的概念。在Remark队段新算法的运用,以及收集过程中的整理压缩,弥补了CMS的不足。 “G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector (CMS)”
 

 
---------------------官方介绍
1、对于cms收集器的堆结构
将堆分成三个部分:


 
Eden:“伊佃园” survivors:幸存区 Old Generation:年老代、老年代
上半部分为“年轻代”,下半部分称之为“年老代”或“老年代”。“年轻代”又分为Eden和两块survivors区域;“年老代”是一块连续的区域。对象的收集发生在上面这整个区域。
2、CMS的“年轻代”GC
“年轻”代是鲜绿色的“年老代”是蓝色的。下图就像你的应用程序运行了一会后的效果。“对象”被扫描在“年老代”的区域。


 
 
在CMS中,“年老代”对象被释放时,它们不会移动位置。这个区域也不会被压缩,除非在一次full GC中。
3、"年轻代"收集
存活的对象被从Eden复制到survivor再到另一块survivor.一个老对象达到了寿命就会进入“老年代”


 
4、后“年轻代”
“年轻代”被清除后,Eden和另一块survivor区域被清空。


 
5、CMS的“年老代”
一共发生两次“停止世界”“初始标记“和”重新标记“,当”年老代“达到一定比例,就会拉开序幕。

 
(1)初使标记是一个简短的过程(可到达被标记),(2)并发标记是当程序继续程序的时候发生活的对象,(3)再次标记是落标记的对象。
6、”年老代“收集-并发收集
对象没有在先前阶段标识将会被释放,但是不是被压缩。


 
注意:未标记对象==死对象
 
7、”年老代“收集-收集之后
被 第4步清扫之后,你可以看到大量的内存空闲了,你会注意这些没有被压缩。


 
最终,CMS收集器通过5重新开始和等待下次开工。
 
-------------------------------------------------------------------------------
1、G1堆结构
堆是一块内存区域,这块区域被划分成固定大小的块。


 
块的大小可以在JVM启动时选择,JVM的块的大小可达到2000,从1M到32M不等 ,由此可推算G1最大内存可管理60多G。
2、G1堆的分配
事实上,这些区域被划分成逻辑上的三块区域:Eden、Survivor、”年老代“区域。


 
 
3、G1的”年轻代“
 
整个堆被划分成2000块,最小的为1M,最大的是32M,蓝色块存放着”年老代“对象,”绿色块存放着“年轻代”对象。


 、
 
注意这些块不一定非的是连续的空间。
4、G1的一个“年轻代”
活着的对象被疏散(复制或移动)到一个或多个survivor块上,如果这些对象达到一定寿命会被送进“年老代”。
 
这是一个(STW),Eden和survivor的大小会在下一次Young GC时被算出。根据这些信息会保持它的大小。可以根据需要变化大小。
 
5、G1的“年轻代”结束
活着的对象被从survivor区域移到“年老代”上


 
 
最近被变动的显示为深蓝色,survivor区域为绿色
 
总和来讲,G1的年轻代有如下特点:
  堆是单一的内存空间划分的区域
  年轻代的内存由一系列非连续的区域组成,这使得它很容易在需要的时候扩展;
 年轻代的收集会停止世界,所以的应用程序线程都会停止;
年轻的GC是并行进行的;
存活的对象被复制到survivor或年老代上。
 
G1 的老年代
 
6、初始标记
 


 
 
7、并发标记


 
 
8、重新标记
 


 
9、复制/清除


 
 
10、复制、清除 之后
选定的区域 已收集和 压缩成 深蓝色的 区域和 绿色 的区域 在图中所示
 


 
 
G1年老代的特点:
  • Concurrent Marking Phase
    • Liveness information is calculated concurrently while the application is running.
    • This liveness information identifies which regions will be best to reclaim during an evacuation pause.
    • There is no sweeping phase like in CMS.
  • Remark Phase
    • Uses the Snapshot-at-the-Beginning (SATB) algorithm which is much faster then what was used with CMS.
    • Completely empty regions are reclaimed.
  • Copying/Cleanup Phase
    • Young generation and old generation are reclaimed at the same time.
    • Old generation regions are selected based on their liveness.

猜你喜欢

转载自qxf567.iteye.com/blog/1987438