深入JVM学习------垃圾回收器
这篇文章主要学习一下四种垃圾回收器。分别是串行、吞吐量优先、响应时间优先以及G1(Garbage1).
串行
- 单线程
- 堆内存较小,适合个人电脑
在执行垃圾回收时会阻塞其它线程,等待垃圾回收后其余线程再运行。
吞吐量优先
- 多线程
- 堆内存较大,多核CPU
- 单位时间内,STW的时间最短
在执行垃圾回收时可以并行的进行垃圾回收。
响应时间优先
- 多线程
- 堆内存较大,多核CPU
- 尽可能让单次STW时间最短
初始标记,时间很短,并且只标记根对象。
并发标记,标记剩余对象。
重新标记,重新标记是因为部分新生代引用了老年代,需要把新生代也标记上。
并发清理,在线程执行并发清理时,由于是并发的,其余线程也可能同时产生垃圾,这些垃圾成为浮动垃圾。
G1
G1的垃圾回收原理是这样的:
它是将堆内存划分为多个域,然后进行操作。
Young Collection:新生代垃圾回收。
Young Collection + Concurrent Mark:新生代垃圾回收 + 标记。
Mixed Collection:综合回收。
- Young Collection
图中一个小块代表一个域,然后新的对象会被存入伊甸园区(E)
在第一次新生代垃圾回收过后,存活下来的数据会进入幸存区。
循环多次上面步骤,最后幸存区的数据在又一次垃圾回收后部分进入老年代(o),一部分进入幸存区(s)
这些过程都是会引起STW的。
-
Young Collection + Concurrent Mark
-
Mixed Collection
图中暂停是为了防止其它线程运行改变它。
只有部分老年代被回收是因为限制了回收时间,导致必须要找垃圾最多的地方进行回收。如果垃圾少的话所有老年代都会被回收。
总结
- SerialGC
- 新生代内存不足发生的垃圾收集 — Minor GC
- 老年代内存不足发生的垃圾收集 — Full GC
- ParallelGC
- 新生代内存不足发生的垃圾收集 — Minor GC
- 老年代内存不足发生的垃圾收集 — Full GC
- CMS
- 新生代内存不足发生的垃圾收集 — Minor GC
- 老年代内存不足
- G1
- 新生代内存不足发生的垃圾收集 — Minor GC
- 老年代内存不足
CMS和G1的老年代内存不足时,只有当垃圾产生速度大于垃圾回收速度才会触发Full GC,否则只会是并发的垃圾回收。