学习笔记:垃圾回收

常见的垃圾回收器:

1.serial GC: 比较古老的垃圾回收器,是单线程工作的,可能发生stop-the-world,不过因为它是单线程工作的,所以比较精简,不需要过多的去维护数据结构,因此它是client端的首选。

从年代来看,在serial Old(永生代)采用的是标记-整理 垃圾回收算法(防止内存空间碎片化),而新生代中主要使用的是复制算法。

2.PerNew GC:是serial GC的多线程回收器,是对新生代的垃圾回收器,主要是配合于CMS GC的老年代垃圾回收器。

3.CMS GC: 采用标记-清除的算法,这样是为了减少停顿时间,使用于很多对时间敏感的应用(web)。但正因为使用了标记-清楚算法,会造成内存碎片化。所以很难避免在长时间运行后的FULL GC,会造成恶劣停顿。

4.Parallel GC: 和serial GC类似的算法,其特点是新生代和永生代是并行处理的。

5.G1 GC:G1 的吞吐量和时间停顿的表现都不错。采用棋盘式的region,region里面是复制算法,但是region和region之间采用标记-整体算法。 是JDK 9默认的垃圾收集器。

再回收算法执行之前,要先确定哪些对象可以回收:

1.引用计数算法: 就是为对象设置一个引用计数,用来记录对象被引用的情况。如果计数器的值为0的时候,说明对象可以被回收。

2.可达性分析: 就是将正在引用的对象,静态属性引用的对象,常量当作 GC root。如果一个对象和这个GC root之间没有引用链条(不可达),就说明这个对象可以被回收。

在确定哪些对象可以回收后,采用垃圾回收算法:

1.复制算法:将存活的对象复制到存活区域(顺序复制,不会碎片化内存),常用于新生代。

2.标记-清除:将标记的对象清除,会发生内存碎片化。

3.标记-整体:就是清除之后,在移动对象,目的是防止内存碎片化。

垃圾回收的过程:

在垃圾回收后存活的对象,在新生代达到阀值之后,会进入存活区,然后进入永生代。所以设置新生代和永生代的大小是优化GC的关键。

猜你喜欢

转载自blog.csdn.net/puzimengya/article/details/81167643