垃圾回收算法和垃圾回收器

2020-11-07  本文已影响0人  Franck_

前置知识:
对象的引用类型
对象可达性分析

垃圾回收算法

标记清除算法:
整体过程

首先将需要清除的对象全部标记出来, 然后将标记的对象全部清除掉。

缺点:

详细过程:有待补充。

复制算法:
整体过程

将内存平均分成两个部分,先使用第一部分的内存,第一部分的内存满了以后,将存活下来的对象复制到第二部分,整齐排列。然后将第一部分全部清理掉。

优点:不会留下多少内存碎片空间。

缺点:
每次只能用一半的内存。
需要复制对象到另一半内存,如果遇到大部分对象存活,效率比较低 。

针对缺点: 不一定要将内存平均分成两部分,可以按照一定的比例划分,例如分成3部分, 8:1:1。

标记整理算法:

整体过程:
和标记清除方法差不多,先将需要回收的对象标记出来,然后将存活的对象左移,所有的存活对象和清除对象分开。 然后将存活边界以外的需要清除的对象进行清理。

详细过程:

优点:内存利用率高,整个内存都可以使用。

缺点:需要标记和移动对象,标记和移动不一定很快。

垃圾回收器

新生代回收器:

Serial :

单线程收集器,现在服务端基本不用。 进行收集的时候,会将所有的其他线程停止下来,然后使用复制算法进行清除,清除完成后,才会重新启动用户的线程。

在单个CPU和小内存的情况下,可以采用。 现在几乎不用。

ParNew :

Serial收集的多线程版本,停止用户线程后,使用多个线程进行回收,在多CPU的机器上,可以更快的回收垃圾。ParNew注重点的是最短的停顿时间。最快的垃圾回收速度。

Parallel Scavenge:

和ParNew收集器差不多,但是这个收集器注重的是系统的总体吞吐量(运行代码时间 / (运行代码时间 + 垃圾回收时间) ),也称为“吞吐量优先收集器”。适合计算型的系统,就是即时响应那么快的系统。 采用的也是复制算法。可以不设置新生代的各分区的比例,由收集器自行判断,找到一个合适的停顿时间或最大吞吐量时间。采用的是复制算法。

老年代回收器

CMS:

Serial Old:

单线程收集器,Serial 收集器的老年代收集版本。采用标记整理算法。

Parallel Old:

Parallel Scavenge 的老年版本。关注吞吐量,采用标记整理算法。

G1回收器:

ZGC回收器:
每次回收TB级别内存,10ms内。
JDK13可以使用,JDK15成为默认收集器。
有待扩展。

垃圾回收器使用经验

大内存的机器16G, 32G,使用G1
每次都可以按照内存区域进行小范围的回收,STW时间比较短。

小内存机器8G,使用ParNew + CMS
每次回收的内存不大,可能就几百M到几G,速度也很快。注意尽量避免FULL GC 。

上一篇下一篇

猜你喜欢

热点阅读