垃圾回收算法
2022-04-18 11:54:07 0 举报
垃圾回收算法
作者其他创作
大纲/内容
假设已经遍历到E(变为灰色了),此时应用执行了 objD.fieldE = null ,D和E之间的线断开,此刻之后,对象E/F/G是“应该”被回收的。然而因为E已经变为灰色了,其仍会被当作存活对象继续遍历下去。最终的结果是:这部分对象仍会被标记为存活,即本轮GC不会回收这部分内存
待回收
进行整理的状态
GC ROOT
G
未使用
E
引用链
可用对象
存活的对象
A
C
object5
B
D
object6
待使用的空间
可用的对象
复制算法
F
H
不可用对象
进行了内存的交换
还未扫描完成的对象
回收之后的状态
标记整理
回收之前的状态
object2
GC ROOTS
object3
object4
将原空间的对象全部清除回收掉
标记清除
灰色对象指向白色对象的引用消失了,然后一个黑色的对象重新引用了白色对象。假设GC线程已经遍历到E(变为灰色了),此时应用线程先执行了:var G = objE.fieldG;objE.fieldG = null; // 灰色E 断开引用 白色GobjD.fieldG = G; // 黑色D 引用 白色G此时切回GC线程继续跑,因为E已经没有对G的引用了,所以不会将G放到灰色集合;尽管因为D重新引用了G,但因为D已经是黑色了,不会再重新做遍历处理。最终导致的结果是:G会一直停留在白色集合中,最后被当作垃圾进行清除。这直接影响到了应用程序的正确性,是不可接受的。
未使用的空间
object1
可回收的对象
将存活的对象 复制到待使用的空间里,而且还会进行内存排序
进行垃圾的清除工作
垃圾对象
0 条评论
下一页