【发布时间】:2013-06-20 14:08:47
【问题描述】:
我正在生成一个大型数据结构并将其写入硬盘。之后我想摆脱对象,以减少内存消耗。我的问题是,在我强制进行垃圾回收之后,已使用的内存量至少与垃圾回收之前一样高。我添加了一个我正在做的最小工作示例。
DataStructure data = new DateStructure();
data.generateStructure(pathToData);
Writer.writeData(data);
WeakReference<Object> ref = new WeakReference<Object>(data);
data = null;
while (ref.get() != null) {
System.gc();
}
代码应该按照线程中的建议强制对数据对象进行垃圾回收:
Forcing Garbage Collection in Java?
我知道这个垃圾收集确实保证了数据对象的删除,但在过去,我通过使用链接中描述的垃圾收集更成功,就像使用 System.gc() 一样。
也许有人知道什么是摆脱大物体的最佳方法。
【问题讨论】:
-
取决于你需要多长时间释放内存,如果 gc 之前的可用空间不够,我不会强制它,而是简单地将引用清空,让 gc 在下一次滴答时完成它的工作。
-
"已用内存量至少与垃圾回收前一样高" 你是如何衡量的?您确定这是已用内存而不是最大允许内存吗?
-
我可以在系统监视器中看到已使用的内存量,它应该从几乎满减少到几乎空。其次,我使用 runtime.totalMemory() - runtime.freeMemory() 来获取实际数量。这表明堆增加了。
标签: java memory garbage-collection