从下面的代码片段RuntimeUtil.java从jlibs保证GC垃圾收集完成。
因为,它也使用System.gc()的,我不明白他们怎么能保证它会发生时代的100%。
以下是摘录:
/**
* This method guarantees that garbage collection is
* done unlike <code>{@link System#gc()}</code>
*/
public static void gc(){
Object obj = new Object();
WeakReference ref = new WeakReference<Object>(obj);
obj = null;
while(ref.get()!=null)
System.gc();
}
从我可以看到它应该工作,他们
1)创建一个对象2)得到一个“弱”引用它3)空对它的引用,以将其标记为垃圾收集4),并用while循环等待它真正消失
它具有强参照和弱参照相对于Garbae收集有关。
强参照的是普通的Java参考,您每天使用的那种。
如果对象是通过强引用(强可到达)的链到达,它不符合垃圾回收。 当你不希望你的工作在垃圾收集器销毁对象,这通常是你想要什么。
弱引用,简单地说,是不是强大到足以迫使对象保留在内存中的参考。 弱引用允许你利用垃圾收集器的判断能力可达性
在尖锐的阶级的GC()方法的工作这个概念。
/**
* This method guarantees that garbage collection is
* done unlike <code>{@link System#gc()}</code>
*/
public static void gc(){
Object obj = new Object();
WeakReference ref = new WeakReference<Object>(obj);
obj = null;
while(ref.get()!=null)
System.gc();
}
一旦WeakReference的开始返回null,它指向的对象已经成为垃圾和WeakReference的对象是几乎无用。 这一般意味着某种清理是必需的;
这就是为什么他们保证会发生时代的100%。
对System.gc单()调用并不能保证符合垃圾收集正在重新声称所有对象。 请参阅如何使软引用在Java中被清除?
在这种情况下,垃圾收集运行多次,直到一个一个弱对象裁判返回null。 我怀疑这种方法的有效性。 将有可能被垃圾收集,许多其他对象。 对我来说,(jlib)没有任何东西可以借鉴。
例如,在写在2009年库中的代码(提取)
/**
* This method guarantees that garbage colleciton is
* done after JVM shutdown is initialized
*/
public static void gcOnExit(){
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
gc();
}
});
}
为什么你需要GC时调用关闭? 有关引用的库是纯粹的垃圾。