Java中的内存管理,加载大文件,如何释放对象?

Java中的内存管理,加载大文件,如何释放对象?,java,memory-management,memory-leaks,Java,Memory Management,Memory Leaks,我正在编写一个解析器,它加载相当大的文件400+mb,并将它们解析为大约32mb的块,然后将解析后的数据保存到磁盘。我通过一个线程和一个同步列表来保存数据,线程定期检查列表并保存其中的任何内容。然后从列表中删除该元素。然而,虚拟机内存的使用继续增长 当Java虚拟机VM内存非常大时,速度非常快,但当达到上限时,速度明显变慢。我可以在300 mb的内存中加载400 mb的文件,但这真的很慢 为什么即使对于我不再使用的对象,它们也会保留在内存中,但可以由垃圾收集器释放(这非常慢) 如何防止堆变大?是

我正在编写一个解析器,它加载相当大的文件400+mb,并将它们解析为大约32mb的块,然后将解析后的数据保存到磁盘。我通过一个线程和一个同步列表来保存数据,线程定期检查列表并保存其中的任何内容。然后从列表中删除该元素。然而,虚拟机内存的使用继续增长

当Java虚拟机VM内存非常大时,速度非常快,但当达到上限时,速度明显变慢。我可以在300 mb的内存中加载400 mb的文件,但这真的很慢

为什么即使对于我不再使用的对象,它们也会保留在内存中,但可以由垃圾收集器释放(这非常慢)

如何防止堆变大?

是的,您可以:

System.gc();
并显式调用垃圾收集器。你可以做一个简单的:

var = null;
您将释放分配给该变量的内存。
我希望这能有所帮助。

如果你只想加载32mb的块,为什么不加载呢?JVM决定何时执行GC。您正在使用的GC算法可能会有一些不同,但我想它是最小的。要么您未能释放引用,要么堆实际上正在被垃圾收集。有一件事你必须确保你的对象不会被提升到老一代。天哪,很明显,我没有发布引用,我认为杀死线程就足够了。我用Java编程才几个星期。@assylias是正确的
System.gc()
无法请求指令。这实际上是我的问题,因为我没有将大量大型数组设置为null,所以即使在线程死后,这些数组仍会在内存中持久存在。