4

来自jlibs的 RuntimeUtil.java的以下片段保证 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();
    }
4

3 回答 3

5

它与Garbae Collection的强参考弱参考有关。

强引用是普通的 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% 的时间。

于 2012-04-06T05:40:09.073 回答
4

据我所见,它应该像他们一样工作

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

于 2012-04-06T05:33:20.970 回答
2

一次调用 System.gc() 并不能保证所有符合垃圾回收条件的对象都会被回收。请参阅如何在 Java 中清除软引用?

在这种情况下,垃圾收集会运行多次,直到弱对象 ref 返回 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?所引用的图书馆是纯粹的垃圾。

于 2012-04-06T06:04:35.430 回答