GC 的概念
Garbage Collection 垃圾收集
1960年 List 使用了 GC
Java 中,GC 的对象是堆空间和永久区
1.引用计算法
使用语言:
COM
ActionScript3
Python
存在的问题:
性能问题
循环引用
2.标记-清除
标记垃圾对象,清除
3.标记-压缩
标记垃圾对象,清除。重新移动至可用空间。
适用于存活对象较多的场合,如老年代。
是对 标记清除 的改良
4.复制算法
与标记-清除 算法相比,较高效。不适合存活对象软多的场合。
必须有两块空间,一样大小,其中只有一块内存在使用。工作时,将所有存活对象复制到另一块空间。
复制完成之后,两块空间角色发生交换。
问题在于,对空间是一种费的。不发生GC时,另一块空间是没有使用的。
5.分代算法
依据对象的存活周期进行分类,短命的称为新生代,长命的称为老年代。
根据不同代的特点,选取合适的收集算法
1.少量对象存活时,适合复制算法
2.大量对象存活时,适合标记清理或者标记压缩
GC算法总结
1.引用计数,没有被使用,因为不能解决循环引用的问题。
2.标记-清除,老年代明确使用
3.标记-压缩,老年代明确使用
4.复制算法
新生代明确使用
少量存活对象,适合复制算法
大量象存存活,适合标记清除 或 标记压缩
所有的算法,需要能够识别一个垃圾对象,因些需要给出一个可触及性的定义
如何识别对象是圾垃
1.可触及性
从根节点可以触及到的对象
2.可复活的
一是所有引用被释放,就是可复活的状态,即等死状态
因为在 finalize() 中可能复活该对象
3.不可触及的,真正可被回收的对象
在 finalize() 后,可以进入不可触及状态
不可触及的对象不能可复活
可以回收
网友评论