电子说
一,采用分代理念的垃圾回收器:
1.年轻代:Serial PartNew Parallel Scavenge
2.老年代:
CMS Serial Old(MSC) Parallel Old
二,不采用分代理念的垃圾回收器:
G1 ZGC Shenandoah
❝
可搭配使用的各个收集器之间关系图:
❞
很多人经常把这两个搞混,当然笔者刚开始的时候也是傻傻分不清楚。其实只要记住并行说的是GC 线程之间的关系,而并发说的是GC和用户线程之间的关系。
❝
并行:同一时间有多条这样的线程在协同工作,但是此时用户线程是等待状态
❞
❝
并发:同一时间GC和用户线程可以一起工作一起运行。因此程序依然能够响应用户线程的操作但是由于GC线程也占用了一部分系统资源,所以此时的用户线程处理的效率会下降
❞
Serial收集器
垃圾回收时需要STW,整个STW需要停止掉所有的用户线程来保证回收过程中引用关系不会发生变化。
但是并不是说垃圾回收的时候只会启用一个回收线程,更准确的描述应该是 「同一时间只允许一个垃圾回收线程工作」 ,也就是 「不支持并行工作」 ,多个GC线程之间串行工作。
1.对于内存资源受限的机器来说比较友好:
由于回收时停止掉了所有的用户线程,因此他不必维护那些: 「用户线程和GC线程同时运行的时候在回收过程中为了保证引用关系发生变化的额外内存开销」 ;比如上一篇文章说到的原始快照和增量更新。
2.而且由于GC线程不是并行的,所以没有线程之间的交互;对于处理器内核少(线程少)的机器来说,
❝
第一点也就是线程串行执行一个线程完了之后才能执行下一个线程,而对于并行的来说其实本质上还是串行只不过各个线程间可以自由来回切换,所以需要对切换前后的资源进行额外的保存等等因此并发涉及到的这部分线程交互开销对于该款串行执行的GC线程时没有的
❞
图示:
串行和并行
但是缺点也很明显:回收过程中停止掉所有用户线程,对用户肯定是不能容忍的
PartNew收集器
该款垃圾收集器和刚才讲的第一个Serial收集器其实最大的不同就是GC Thread可以并行的区别。注意是 「并行」 ,之后讲解的 「CMS」 才是可以实现GC Thread 「并发」 的收集器。
该款垃圾收集器同样和PartNew收集器一样,并行GC线程。只不过该款收集器重点是倾向于 「吞吐量」 。
Serial Old收集器
❝
区别于Serial回收器只是回收算法的不同
❞
Parallel Scavenge收集器的老年代版本,支持多线程 「并发」 收集。
「吞吐量优先垃圾回收器组合」 :
新生代采用Parallel Scavenge收集器,老年代采用Parallel Old收集器
全部0条评论
快来发表一下你的评论吧 !