作者:RvJ手机用户2997047695f | 来源:互联网 | 2023-07-02 20:37
引用计数算法原理:在内存中该对象的引用做统计。增加一个引用,添加数量加一。减少一个引用,数量减一。当该对象的数量统计为0的时候,就可以回收了。使用:微软的COM技术、ActionScript、
引用计数算法
原理:在内存中该对象的引用做统计。增加一个引用,添加数量加一。减少一个引用,数量减一。当该对象的数量统计为0的时候,就可以回收了。
使用:微软的COM技术、ActionScript、Python等
优点:实现简单、效率高
缺点:循环没法统计
复制
原理:把内存分为两个区域,一个为空(from servivor),另一个处理业务(to servivor)。在from servivor区做垃圾回收时,没被使用的对象做GC,被使用的对象复制到to servivor区,from servivor清空。
优点:实现简单,高效,不会出现”碎片“的问题
缺点:空间利用率是以前的一半。
GC前
![](https://img.php1.cn/3cd4a/1eebe/cd5/70be2ca197098d98.webp)
from servivor to servivor
GC后
![](https://img.php1.cn/3cd4a/1eebe/cd5/1113165c4904ecc5.webp)
from servivor to servivor
标记-清除算法:
原理:此算法分为两个阶段,第一阶段从根节点开始标记被引用的对象,第二阶段把没有被引用的对象删除。
特点:此算法需要暂停整个应用。
缺点:有碎片。
回收前
![](https://img.php1.cn/3cd4a/1eebe/cd5/6789f68dabde0aed.png)
回收后
![](https://img.php1.cn/3cd4a/1eebe/cd5/bff2716168d1ed7b.webp)
注:可以看到回收后只有“被引用的对象”存在,但内存不连续。有很多空的内存相隔在中间,这就是“”碎片”
标记整理算法:
原理:该算法结合了“标记清除”和复制算法的特点,分为三个阶段。第一阶段从根节点开始标记被引用的对象,第二阶段把没有被引用的对象删除,第三阶段把存回下来的对象压缩到一块,并按照顺序排放。
优点:避免了”标记-清除算法“的碎片问题。也避免了复制算法的两倍空间问题。
回收前
![](https://img.php1.cn/3cd4a/1eebe/cd5/617c1173853af4b6.webp)
回收后
![](https://img.php1.cn/3cd4a/1eebe/cd5/5287a7b3296ea13e.webp)