垃圾收集算法与垃圾收集器

垃圾收集算法

标记-清除算法

把需要回收的对象标记起来,然后清除。会产生大量的空间碎片,效率也不高。

复制算法

将内存分为大小相同的两 块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到 另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内 存区间的一半进行回收。

标记-整理算法

先标记,然后让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。

分代算法

不同的代采用不同的算法。

垃圾收集器

Serial收集器 (-XX:+UseSerialGC  -XX:+UseSerialOldGC)

使用一个线程收集、收集工作开展时必须停掉其他所有线程。
新生代复制算法、老年代标记-整理算法

ParNew收集器(-XX:+UseParNewGC)

多线程
新生代复制算法、老年代标记-整理算法

Paralel收集器

新生代复制算法、;老年代标记-整理算法
Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU),所以不怎么使用。
可以多种参数调整停顿时间。

CMS收集器

停顿时间短
4个步骤:

  1. 初始标记 stop the world
  2. 并发标记
  3. 重新标记 stop the world
  4. 并发清除

并发重置
步骤1先直接标记gcroot根直接引用的对象,在步骤2闭包查找所有的对象。步骤2可能产生新的垃圾或者引用对象,所以需要3重新标记。
在步骤4可能产生新的垃圾(浮动垃圾)、导致full gc,如果这个情况发生、就直接转为serial old收集器去做full gc。
CMS只能用在老年代,一般线上使用年轻代ParNew+老年代CMS。
缺点:
对cpu资源敏感,会和应用程序抢cpu
无法处理浮动垃圾,只能下次处理。
回收算法:标记-清除会产生大量的空间碎片,不过可以通过参数做一些优化。-XX:+UseCMSCompactAtFullCollection  可以让jvm在执行完标记清除后再做整理。
执行过程不确定:可能产生full gc。

G1收集器

和CMS收集器类似。
4个步骤:

  1. 初始标记 stop the world
  2. 并发标记
  3. 最终标记 stop the world
  4. 筛选回收 stop the world 可以控制回收部分region,控制gc时间。

区别
把整个内存分为很多小块region。
多了一个humongous存放大对象
多了一个mixed GC混合GC、年轻代和老年代的容量到达一定值触发。
G1收集器适合于大内存环境使用。

你可能感兴趣的:(jvm)