具有以下功能: 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如何通过复制新的较小数组来回收内存。
答案 0 :(得分:3)
只在需要时回收内存更有效。在这种情况下,让GC在需要时进行异步操作会更加简单/快捷。您可以使用System.gc()
为JVM提供一个提示,但这可能会更慢并使您的程序变得复杂。
ArrayList.remove如何通过复制新的较小数组来回收内存。
它没有这样做。它永远不会缩小阵列,也不需要。
如果你真的需要缩小集合,我很怀疑,你可以创建一个新的ArrayList,其中包含你想要保留的元素的副本。
答案 1 :(得分:2)
bars= null ;
将是最好的。 clear
不保证释放任何内存,只是将逻辑内容重置为“空”。
事实上,bars= null ;
并不能保证会立即释放内存。但是,它会使bars
及其所有依赖项之前指向的对象“准备好进行垃圾收集”(“终结”,真的,但让我们保持这个简单)。如果JVM发现自己需要内存,它将收集这些对象(这里的其他简化:这取决于JVM配置使用的确切垃圾收集算法)。
答案 2 :(得分:0)
答案 3 :(得分:0)
您无法强制内存回收,这将在发生垃圾收集时发生。
如果您使用clear()
,则会将引用清除到集合中包含的对象。如果没有对这些对象的其他引用,则下次运行GC时将回收它们。
集合本身(仅包含引用,而不是引用的对象)将不会调整大小。获取集合使用的存储的唯一方法是将引用bars
设置为null
,以便最终回收它。