JVM 垃圾回收机制
定位垃圾的方法:
- **Reference Count(引用计数算法):**有没有引用指向?有则不是垃圾,没有则是垃圾
- 缺点:不可以解决循环引用
- 举例:A->B->C->A
ABC是一坨垃圾
- **(Root Searching)根可达算法:**从根上往下捋,能捋到的不是垃圾,捋不到的是垃圾
垃圾清除的方法
- Mark-Sweep:标记清除法
- 没有用的就标记为可用
- Copying 算法:
- 仅可在部分内存内使用引用,当执行垃圾回收的之后,将可用的复制到另一部分的内存,随后清空该内存。
- 优点:效率高
- 缺点:浪费内存
- 标记整理算法(处女座算法)
- 作用发现垃圾后,将有用的排列起来
- 优点:
- 缺点:效率低
对于内存的管理
- 分代模型
- 年轻代 | 老年代
- 内存一分为二
- 分区模型
- 分成一个个的小格子
左侧为分代,右侧有分区
左侧年轻代,当 new 了新的对象后进入 eden
(年轻代),随后用 Copy 算法,将有用的内存复制到 Survivor1,下一次将 Survivor1 中的以及 Eden 中的放入Survivor2(Survivor1与Survivor2 不断交换,总有一个是空的),每次都没回收掉年龄+1
,当成长到一定年龄后进入tenured
(老年代)。
Serial(单线程 STW)
A stop-the-world(STW),copying collector which uses a single GC thread.
当垃圾回收器开始干活的时候,所有的线程(业务线程)全部停止。
- 优点:单 CPU 效率最高,虚拟机是 Client 模式的默认垃圾回收器
- 缺点:会导致程序卡顿
Parallel Scavenge (多线程 STW)
A stop-the-world(STW),copying collector which uses a multiple GC threads.
- 注意:线程无法无限增加
- 优点:效率更高
- 缺点:线程需要切换,同样可能会造成卡顿
CMS(Concurrent Mark Sweep)并发
- 问题:
- 问题 1:可能会产生浮动垃圾(本次标记非垃圾后被弃用了)
- 问题 2:已经被标记为垃圾的对象被业务线程建立连接了
- 解决办法 :三色标记算法
- 优点:效率更高
- 缺点:线程需要切换,同样可能会造成卡顿
相关算法
三色标记算法
没有遍历到的节点:白色;自己完成标记还没来得及标记 fields :灰色;自己标记且 fields 全部完成标记:黑色
优点:下一次只要从灰色开始就可以了,黑色就不用开始了。