垃圾回收分类

时间: 2023-07-18 admin 互联网

垃圾回收分类

垃圾回收分类

垃圾回收我们把之前使用过,现在不再使用或者没有任何指针指向的内存空间称为“垃圾”,而将这些“垃圾”搜集起来再次利用的机制称为 “垃圾回收”。

现在,垃圾回收机制已经大行其道,在大多数编程语言中,我们都可以看到对垃圾回收特性的支持。如下表:

各种编程语言对垃圾回收机制的支持
编程语言对垃圾回收机制的支持
C++部分
Java支持
Python支持
C不支持
C#支持
Ruby支持
PHP支持
Perl支持
Hashkell支持
Pascal不支持

垃圾回收的方式很多,但主要分为两大类:

1、基于引用计数的垃圾回收器

       引用计数主要是使用系统记录对象被引用(引用、指针)的次数。当对象被引用的次数变为0时,该独享即可被视为“垃圾”而回收。特点是实现简单,不会对系统的缓存或者交换空间造成冲击,但比较难处理“环形引用”问题,此外由于计数带来的额外开销也不少,所以在使用上也有一定的限制。

2、基于跟踪处理的垃圾回收器

       相比于引用计数,跟踪处理的垃圾回收机制被广泛地应用。其基本方法是产生跟踪对象的关系图,然后进行垃圾回收。使用跟踪方式的垃圾回收算法主要有以下几种:

(1)标记-清除

算法分为两个过程。首先将程序中正在使用的对象视为“根对象”,从跟对象开始查找它们所引用的对空间,并在这些堆空间上做标记。当标记结束后,所有被标记的对象就是可达对象或活对象,而没有被标记的对象就被认为是垃圾,在第二步亲扫阶段会被回收掉。

(2)标记-整理

      标记阶段同第一种方法,但是在标记完之后,不再遍历所有对象清扫垃圾了,而是将活的对象向“左”靠齐,这就解决了内存碎片的问题。

(3)标记-拷贝

       这种算法将堆空间分为两个部分:From和To。刚开始系统只从From的对空间里面分配内存,当From分配慢的时候系统就开始垃圾回收:从From对空间找出所有活的对象,拷贝到To的对空间里,这样From的对空间里面就全剩下垃圾了,而对象被拷贝到To里之后,在To里是紧凑排列的,接下来将From和To交换一下角色。