首先判断对象活动对象还是垃圾对象:
1.引用计数器算法:
为每个对象添加一个引用计数器,每当有一处引用,计数器加一,每当一处引用失效,计数器减一
缺点:当两个对象相互引用,那么两个对象都无法回收
2.根搜索算法
从根对象开始,任何可以被触及的对象是活动对象,否则为垃圾对象
垃圾回收算法:
1.标记清除算法:
使用根搜索算法标记要回收的对象,最后统一回收。
- 效率不高
- 会产生不连续的空间碎片
2.复制回收算法:
将可用内存一分为二,当其中一份内存用满后,将当期存活的对象复制到另一份内存,并清除当期内存
- 内存使用效率低
3.标记整理算法:
使用根搜索算法标记回收对象,将活动对象移动到内存一端,然后清除垃圾对象
4.分代回收算法:
分三代:新生代,老年代,持久代
- 新生代分三份,每份都使用复制回收算法,当最后一份也满了,复制到老年代
- 老年代使用标记整理算法
- 持久代用来存储常量,静态
垃圾回收触发条件:
新生代写满,触发ScavengeGC,较频繁
老年代,持久代写满,显示调用System.GC();触发FullGC,不频繁
垃圾收集器:
Serial收集器:收集垃圾时,暂停其他线程,Client新生代默认收集器
ParNew收集器:Serial多线程版,Server新生代默认收集器
Parallel Scavenge收集器:多线程,复制算法,新生代收集器
Serial Old收集器:老年代收集器,单线程,标记整理算法
Parallel Old收集器:老年代收集器,多线程,标记整理算法
CMS收集器:老年代收集器,标记清除算法
- 初始标记
- 并发标记
- 重新标记
- 并发清除
G1收集器:老年代收集器,标记整理算法