0

具有以下功能: Collection#clear

如何尝试回收可以从调用中释放的内存?代码示例:

public class Foo
{
    private static Collection<Bar> bars;
    public static void main(String[] args){
        bars = new ArrayList<Bar>();  
        for(int i = 0; i < 100000;i++)
        {  
            bars.add(new Bar());
        }      
         bars.clear();  
         //how to get memory back here
    }
}

编辑

我正在寻找的类似于 ArrayList.remove 如何通过复制新的较小数组来回收内存。

4

4 回答 4

3

仅在需要时回收内存更有效。在这种情况下,让 GC 在需要时异步执行会更简单/更快。您可以使用提示给 JVM,System.gc()但这可能会更慢并且使您的程序复杂化。

ArrayList.remove 如何通过复制新的较小数组来回收内存。

它不这样做。它永远不会缩小数组,你也不需要。

如果您确实需要使集合更小,我对此表示严重怀疑,您可以创建一个新的 ArrayList ,其中包含您要保留的元素的副本。

于 2013-08-20T16:48:40.383 回答
2
bars= null ;

将是最好的。 clear不保证释放任何内存,只是将逻辑内容重置为“空”。

事实上,bars= null ;并不保证内存会立即被释放。但是,它会使先前指向的对象bars及其所有依赖项“准备好进行垃圾回收”(实际上是“终结”,但让我们保持简单)。如果 JVM 发现自己需要内存,它将收集这些对象(这里的其他简化:这取决于 JVM 配置为使用的确切垃圾收集算法)。

于 2013-08-20T16:45:54.220 回答
0

你不能。

在不再引用对象后的某个时间点,GC 将为您收集它们。

编辑:要强制 ArrayList 释放其对巨大空数组的引用,请调用trimToSize()

于 2013-08-20T16:46:17.583 回答
0

您不能强制进行内存回收,这将在垃圾收集发生时发生。

如果使用clear(),您将清除对集合中包含的对象的引用。如果没有其他对这些对象的引用,那么它们将在下次运行 GC 时被回收。

集合本身(仅包含引用,而不是引用的对象)将不会调整大小。取回集合使用的存储空间的唯一方法是将引用设置为barsnull以便最终将其回收。

于 2013-08-20T16:49:21.827 回答