mar*_*kus 3 java memory garbage-collection
我正在生成一个大型数据结构并将其写入硬盘.之后我想摆脱对象,减少内存消耗.我的问题是,在我强制进行垃圾收集后,使用的内存量至少与垃圾收集前一样高.我添加了一个最小的工作示例,我正在做什么.
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();
}
Run Code Online (Sandbox Code Playgroud)
代码应强制对数据对象进行垃圾收集,因为它在线程中是推荐的:
强制Java中的垃圾收集?
我知道这个垃圾收集确实保证了数据对象的删除,但是在过去我通过使用链接中描述的垃圾收集使用简单的System.gc()更成功.
也许有人有一个答案,它是摆脱大型物体的最佳方式.
这似乎是过早的优化(或者更确切地说是幻觉).System.gc();不保证强制垃圾收集.你在这里做的是忙着等待一些无保证的gc发生.但是如果堆没有被填满,JVM可能根本不会启动垃圾收集.
我认为,当您对应用程序进行压力测试时,您应该开始考虑这个问题,并且可以将此部分识别为瓶颈.
所以简而言之,你不能真正强迫 gc这是故意的.JVM将知道何时以及如何释放空间.我认为,如果你清除你的参考资料并打电话,System.gc();你可以继续前进而不关心它是否被清理干净.您可以阅读有关如何微调垃圾收集器的官方文档.您应该根据文档使用某些GC调优,而不是从代码中询问java到GC.
只是一个旁注:如果需要,JVM将扩展一些堆的代.据我所知,有一个配置选项,您可以在JVM收缩一代时设置一些百分比.MinHeapFreeRatio/MaxHeapFreeRatio如果您不希望Java保留不需要的内存,请使用.