1、标记清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点是效率问题和产生大量不连续的内存碎片,导致程序后期需要分配大对象时无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。
2、复制算法:将可用内存划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。
3、标记整理...
分类:
编程语言 时间:
2015-07-31 22:04:39
阅读次数:
170
编程语言中实现自动垃圾回收机制方式有好几种,常见的有标记清除,引用计数,分代回收等。
C++需要手动管理垃圾,可以自己实现一个智能指针。最简单的是引用计数的思路
template
class SmartPointer {
T* obj;
unsigned int* count;
SmartPointer(T* ptr) {
obj = ptr;
...
分类:
其他好文 时间:
2015-07-30 23:31:19
阅读次数:
194
垃圾收集器用到的垃圾收集算法标记-清除(Mark-Sweep)算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它主要有两个缺点:一个是效率问题,标记和清楚过程的效率都不高;另外一个是空间问题,标记清楚后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够连续的内存空间而不得不提前出发另一次垃圾收集动作。执行过程如下图所示...
分类:
编程语言 时间:
2015-07-27 23:02:17
阅读次数:
172
0. 垃圾回收算法概述标记清除算法 | |--- 标记时间过长 | | | |--- CMS:通过初始标记、并发标记和重新标记来拆分标记过程 | |--- 垃圾回收后,导致内存碎片过多 | |--- 标记压缩算法:将垃圾移动到一侧来减少内存碎片 | |--- 标记清除算法:...
分类:
编程语言 时间:
2015-07-11 16:20:48
阅读次数:
200
【收集算法的选择】 新生代,由于只有少量的对象能存活下来,所以选用“复制算法”,只需要付出少量存活对象的复制成本。 老年代,由于对象的存活率高,没有额外的空间分担,就必须使用“标记-清除”或“标记-整理”算法。 那么老年代也使用标记-复制策略吧?当然不行!老年代中的对象可不像新生代中的,每次回...
分类:
其他好文 时间:
2015-07-08 22:19:12
阅读次数:
139
第一种实用和完善的垃圾收集算法是 J. McCarthy 等人在 1960 年提出并成功地应用于 Lisp 语言的标记-清除算法。仍以餐巾纸为例,标记-清除算法的执行过程是这样的:
午餐过程中,餐厅里的所有人都根据自己的需要取用餐巾纸。当垃圾收集机器人想收集废旧餐巾纸的时候,它会让所有用餐的人先停下来,然后,依次询问餐厅里的每一个人:“你正在用餐巾纸吗?你用的是哪一张餐巾纸?”机器人根据...
分类:
编程语言 时间:
2015-07-07 14:50:56
阅读次数:
267
跟踪收集算法:
复制(copying):
将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,不需要标记骤,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
标记清除(mark-sweep):
...
分类:
其他好文 时间:
2015-07-02 10:17:13
阅读次数:
263
引用计数:一个对象被引用计数器加一,取消引用计数器减一,引用计数器为0才能被回收。优点:简单。缺点:不能解决循环引用的问题,比如A引用B,B引用A,但是这两个对象没有被其他任何对象引用,属于垃圾对象,却不能回收;每次引用都会附件一个加减法,影响性能。
标记清除法:分为两个阶段:标记阶段和清除阶段。标记阶段通过根节点标记所有可达对象,清除阶段清除所有不可达对象。缺点:因为清除不可达对象之后剩余的内存不...
分类:
编程语言 时间:
2015-05-27 15:44:48
阅读次数:
131
并发的标记—清除(Concurrent Mark Sweep,缩写为 CMS)收集器,使得在整个收集的过程中只是很短的暂停应用的执行,可通过在 JVM 参数中设置-XX:UseConcMarkSweepGC 来使用此收集器,不过此收集器仅用于old和Perm(永生)的对象收集,并发的标记—清除较之S...
分类:
其他好文 时间:
2015-05-25 09:52:22
阅读次数:
113
之前写过几篇自己动手系列的文章,简要实现了栈,二叉堆,malloc等函数,对于垃圾收集器,一直也有所耳闻。像python中主要使用引用计数手段来管理内存,为了解决循环引用的问题,引入了分代收集和标记-清除方式。当然python中可能产生循环引用的只可能是容器类对象如list,dict,class等,而像int,string是不可能产生循环引用的。当然python中的垃圾收集器实现是比较复杂的,我也没...
分类:
其他好文 时间:
2015-05-17 18:45:05
阅读次数:
133