在 Java,C#等语言中,比较主流的判定一个对象已死的方法是:1. 可达性分析析(Reachability Analysis)。
1.所有生成的对象都是一个称为“GC Roots”的根的子树。从GC Roots开始向下搜索,搜索所经过的路径称为引用链,当一个对象到GC Roots没有任何用链可以到达时,就称这个对象是不可引用的,也就被GC回收了。
2.无论是引用计数器还是可达性分析,判定对象是否存活都与引用有关!那么,如何定义对象的引用呢?
当内存空间还够时,能够保存在内存中;如果进行了垃圾回收之后内存空间仍旧非常紧张,则可以跑出这些对象,所以根据不同的需求,给出引用类型的不同,GC回收时也会有不同的操作:
a) 强引用(Strong Reference):Object obj = new Object();只要强引用还存在,GC 永远不会回收掉被引用的对象。
b) 软引用(Soft Reference):描述一些还有用但非必需的对象。在系统将会发生内存溢出之前,会把这些对象列入 回收范围进行二次回收(即系统将会发生内存溢出了,才会对他们进行回收。)
c) 弱引用(Weak Reference):程度比软引用还要弱一些。这些对象只能生存到下次 GC 之前。当 GC 工作时,无论内 存是否足够都会将其回收(即只要进行 GC,就会对他们进行回收。)
d) 虚引用(Phantom Reference):一个对象是否存在虚引用,完全不会对其生存时间构成影响
Java的GC什么时候回收垃圾
最新推荐文章于 2024-07-15 15:40:36 发布