Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ArrayList.clear()方法不';你不能释放内存吗?_Java_Optimization_Arraylist_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 为什么ArrayList.clear()方法不';你不能释放内存吗?

Java 为什么ArrayList.clear()方法不';你不能释放内存吗?,java,optimization,arraylist,memory-leaks,garbage-collection,Java,Optimization,Arraylist,Memory Leaks,Garbage Collection,我查看了ArrayList.clear()&发现它没有释放内存,而是使该列表为空。 当您可以手动告诉编译器不再需要这个特定的ArrayList时,为什么要等待GC来释放内存(它可以在clear方法本身中完成) 为什么你不必要地想给GC额外的头痛呢 我知道System.gc()会影响应用程序的性能,因为它会对整个应用程序运行垃圾收集 如果我的服务器内存有限&列表大小太大,有没有办法收集这个特定的ArrayList垃圾,而不是等待GC来救援 编辑:- 出现此问题是因为我已初始化ArrayList(5

我查看了ArrayList.clear()&发现它没有释放内存,而是使该列表为空。 当您可以手动告诉编译器不再需要这个特定的ArrayList时,为什么要等待GC来释放内存(它可以在clear方法本身中完成)

为什么你不必要地想给GC额外的头痛呢

我知道System.gc()会影响应用程序的性能,因为它会对整个应用程序运行垃圾收集

如果我的服务器内存有限&列表大小太大,有没有办法收集这个特定的ArrayList垃圾,而不是等待GC来救援

编辑:- 出现此问题是因为我已初始化ArrayList(500000)&假设由于某些预先初始化的变量,我的对象大小约为1000字节,但由于形成第一个对象本身时出现异常,我需要从该函数返回,释放我分配给该ArrayList的内存。我希望我的应用程序消耗尽可能少的内存。 GC是我最后的选择

为什么要等待GC的到来&释放内存(它可以在clear方法本身中完成)

不,它不能。
ArrayList
确实不再引用对象,但是
clear()
方法不知道它们是否仍在其他地方被引用,因此这是垃圾收集器的作业

为什么要等待GC的到来&释放内存(它可以 以清晰的方法完成)

上面这句话有一个很大的误解:Java中的所有内存都是由GC释放的,无法手动释放堆上对象占用的内存

但是要回答为什么
clear()
会将所有元素置零,而不仅仅是丢弃旧的支持数组的问题,简单的答案是“因为它是这样写的”

稍长一点的回答是,通常在用新元素重新填充列表之前使用
clear()
,因此丢弃旧数组并分配新数组(可能需要多次重新分配才能达到与先前备份数组相同的大小)被视为太浪费


另一方面,如果您想永远摆脱
ArrayList
,则不需要对其调用
clear()
,您只需清空对列表本身的任何引用。

系统会为您管理
Java
中可能重复的内存…如果内存不足,它将首先尝试通过垃圾收集回收任何内存。通过取消引用对象(使其为
null
),您告诉
gc
可以回收被取消引用对象使用的内存。这是java内存模型。所有内存都由垃圾收集器释放。也;如果数组列表中的项在其他地方使用,您希望释放它们吗?数组本身也可以在其他地方使用(尽管您可能必须使用反射来获得它),垃圾收集器是Java中释放内存的唯一方法。但坦率地说,它太快了,你不应该在意。