Java Collection #clear reclaim memory

时间:2013-08-20 16:43:57

标签: java performance memory

具有以下功能: 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 个答案:

答案 0 :(得分:3)

只在需要时回收内存更有效。在这种情况下,让GC在需要时进行异步操作会更加简单/快捷。您可以使用System.gc()为JVM提供一个提示,但这可能会更慢并使您的程序变得复杂。

  

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

它没有这样做。它永远不会缩小阵列,也不需要。

如果你真的需要缩小集合,我很怀疑,你可以创建一个新的ArrayList,其中包含你想要保留的元素的副本。

答案 1 :(得分:2)

bars= null ;

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

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

答案 2 :(得分:0)

你不能。

在没有更多对象的引用之后的某个时刻,GC会为你收集它们。

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

答案 3 :(得分:0)

您无法强制内存回收,这将在发生垃圾收集时发生。

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

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