如何判断对象是否为垃圾:
引用计数法:对象是否被引用,无法解决对象循环引用导致的问题
可达性分析:也叫根搜索法
垃圾收集算法
1、标记-清除(Mark-Sweep)
示意图
- 深蓝色:有引用
- 深灰色:没引用
- 白色:待分配
回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间不变,清除:对全部垃圾对象遍历后清除
缺点:
耗时---整个堆的对象遍历
空间不连续,产生大量碎片空间---可能导致gc次数增多
2、复制算法(Copying):应用场景年轻代中s0,s1
示意图
回收前:空间复制,只用一份空间,对象引用空间不连续,生命周期短,朝生夕死,
回收后:会排列规整
优点:空间连续
缺点:浪费空间
3、标记-整理(Mark-Compact):应用场景---老年代
示意图
回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间连续,清除:没遍历全部,清除存活对象以外的空间
优点:空间连续,节约空间
缺点:标记耗时
4、分代收集算法:分代收集算法就是目前虚拟机使用的回收算法
垃圾收集器
1、串行收集器
特点:单线程、会暂停用户线程
- Serial收集器,年轻代
- SerialOld收集器,老年代
2、并行收集器:
特点:多线程、会暂停用户线程
普通:
- ParNew收集器--年轻代
- ParNew收集器对应老年代一般为CMS收集器
吞吐量优先:
- Parallel Scavenge收集器,应用年轻代
- Parallel Old收集器,应用老年代
3、并发收集器
特点:停顿时间优先,可以交替运行
- CMS收集器,应用老年代,标记清除算法(不用标记整理是因为,整理后对象地址发生变化,用户线程对象运行中,会改变地址,如果有引用则会出错)
优点:并发收集、停顿时间短
缺点:产生空间碎片、对cpu要求稍高、无法处理并发阶段产生的垃圾
- G1收集器(jdk1.9默认),新老生代都适用,标记整理算法
在完善中......
标签:收集器,对象,算法,引用,JVM,空间,垃圾 From: https://www.cnblogs.com/cm21/p/18253131