我正在生成一个大型数据结构并将其写入硬盘。之后我想摆脱该对象,以减少内存消耗。我的问题是,在强制垃圾收集之后,已用内存量至少与垃圾收集之前一样高。我添加了一个我正在做的最小工作示例。
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();
}
代码应该按照线程中的建议强制对数据对象进行垃圾收集:
在 Java 中强制进行垃圾回收?
我知道这个垃圾收集确实保证了数据对象的删除,但在过去,我通过使用垃圾收集(如链接中所述)简单地使用 System.gc() 来获得更成功的结果。
也许有人知道摆脱大型物体的最佳方法是什么。
这似乎是不成熟的优化(或者更确切地说是一种错觉)。System.gc();
不保证强制垃圾收集。您在这里所做的就是忙于等待一些非保证垃圾回收的发生。但如果堆没有填满,JVM 可能根本不会启动垃圾收集。
我认为当你对应用程序进行压力测试时,你应该开始考虑这个问题,并且你可以将这部分识别为瓶颈。
所以简而言之,你真的不能forceGC,这是故意的。 JVM 将知道何时以及如何释放空间。我认为如果你清除你的参考资料并打电话System.gc();
您可以继续前进,而不必关心它是否被清理干净。您可以阅读官方文档关于如何微调垃圾收集器。您应该根据文档使用一些 GC 调整,而不是在代码中要求 java 进行 GC。
旁注:如果需要,JVM 将扩展堆的某些代。据我所知,有一个配置选项,您可以在 JVM 收缩一代时设置一定的百分比。使用MinHeapFreeRatio/MaxHeapFreeRatio
如果你不希望 Java 保留它不需要的内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)