垃圾回收机制
一、垃圾回收机制
不能被程序访问到的数据,就称之为垃圾
1.引用计数
引用计数是用来记录值的内存地址被记录的次数
每一次对值地址的引用都可以是该值的引用计数+1
每一次对值地址的释放都可以使该值的引用计数-1
当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收
ps.
循环导入
比如:列表的相互引用
ls1 = [666]
ls2 = [888]
ls1.append(ls2)
ls2.append(ls1)
当外部ls1,ls2的引用结束的时候,这两者仍在互相引用,这种情况,引用计数永远大于1,所以只靠引用计数无法检测出这部分垃圾。
2.标记删除
标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以做为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象。
删除:删除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
3.分代回收
分代:指的是根据存活时间来为变量划分不同等级(也就是不同的代)
新定义的变量,放到新生代这个等级中,假设每隔一分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某一个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc都需要扫描的变量的总个数就变少了,节省了扫描的总时间。接下来,青春代的对象,也会以同样的方式移动到老年代中,也就是等级(代)越高,被垃圾回收机制扫描的频率越低
回收:依然是引用计数作为回收的依据