5-JVM的GC算法(3)

来源:互联网 发布:常见数据库 编辑:程序博客网 时间:2024/05/29 16:27

G1收集器

G1收集器(Garbage First)是从JDK1.7 u4版本之后正式引入到java中的垃圾收集器,此类垃圾收集器主要应用在多CPU以及大内存的服务器环境下这样可以极大的减少垃圾收集的 为了在将来某一个时间内可以替换掉CMS(Concurrent Mark Sweep)收集器。

 

G1垃圾收集器采用的是区域化、分布式的垃圾收集器。其核心思想为将整个队内存区域划分成大小相同的子区域(Region),在JVM启动时会自动设置这些子区域的大小(区域大小范围“1MB~32MB”,最多可以设置2048个区域,即支持的最大内存为:“32MB*2048=65536M”、64GB内存),这样Eden,Survivor,Tenured就变为了一系列不连续的内存区域,也就避免全内存区的GC操作。 O是老年代,E是Eden区,S是Survivor区

 

图一:G1收集器内部分区

虽然G1收集器里面讲将所有内存看成一个整体,但是在整体的内部还是采用了分区的思想,并针对不同的区域采用不同的GC算法。在回收垃圾的时候就观察每一块可以内存大小发生变化没,如果可以内存没有变,那么就不需要扫描,从而使得整个的扫描效率有所提高

 

G1收集器对年轻代的收集过程:

图二:标记出待收集的内存区域

图三:收集垃圾并重新分配内存

年轻代:所有垃圾的保存区域有可能会被清空后重新分配

 

 

G1收集器对老年代的收集过程:

但是老年代的处理流程不一样,因为任何时候如果想要标注老年代不用的内存,都需要进行一些暂停,而G1中最大的好处在于它不用全局扫描只需要按照区域来扫描即可。


图四:老年代G1收集器的线程变化情况

 

具体流程(图五至图八):

图五:标记出待回收的老年代的区域

图六:回收待回收的老年代的区域

 

图七:扫描整合出Eden的内存,把活跃的内存复制到老年代

 

图八:收集后的结果

 

最后强调两点:

1、G1收集器的垃圾处理和传统的垃圾回收不一样,关键因素是它将所有的内存进行了子区域划分。

2、G1收集器的没有默认配置,需要慎重使用,具体配置方法可百度。

原创粉丝点击