本文共 1242 字,大约阅读时间需要 4 分钟。
通过这段时间对tinypy源码和编译原理这本书的研究,我终于敲开了增量式垃圾回收的“小门”;如果读者没有接触过基本的标记-清扫垃圾回收,最好先对其进行一定的了解。
列表:
(实质上是对可达对象的树进行广度优先的遍历过程,这个过程中会产生一些被称之为“漂浮垃圾”的对象,他们已经不可达,但是仍然在U集合里面,由于他们不可能再次被引用,所以在下一轮FullGC过程中会被清除)
有两种方式
由于大部分程序写操作少于读操作,考虑到性能,通常我们拦截写操作
// 比如下面操作obj.name = value // dict是一个对象,string是一个字符串// 这里修改了dict对象的name属性// 那么需要进行标记的就是obj和value两个对象// 因为obj和value有可能之前没有引用关系
【注意】可以根据需要调整增量跟踪的频率
在此之前,我考虑过増变过程是否需要跟踪改变的对象,因为如果引用新对象,那么该对象已在产生的时候标记并且放入已扫描列表,如果引用旧对象,那么旧对象要么已经标记,要么将在后面标记,这样听起来似乎有些道理。
事实上,这个推论有一个错误,试想这样一个情况
var b = new Person(); // b被标记为1a.friend = b; // a.friend = c; // // 发生全量GC, b被标记为0d.friend = b; // 再次引用b,但是变更过程没被跟踪// 全量GC,b被回收
因此,拦截所有的写操作是必须的。
转载地址:http://atuws.baihongyu.com/