Java的:使用jlibs保证垃圾收集(Java: Guaranteed garbage colle

2019-09-16 08:54发布

从下面的代码片段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();
    }

Answer 1:

从我可以看到它应该工作,他们

1)创建一个对象2)得到一个“弱”引用它3)空对它的引用,以将其标记为垃圾收集4),并用while循环等待它真正消失



Answer 2:

它具有强参照弱参照相对于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%。



Answer 3:

对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时调用关闭? 有关引用的库是纯粹的垃圾。



文章来源: Java: Guaranteed garbage collection using jlibs