答案 0 :(得分:1)
现在,您正在为每个循环创建一个新缓冲区。根据您的垃圾回收,其中一些可能无法从内存中回收/释放,然后您就会耗尽。您可以使用System.gc()
调用垃圾收集器,但无法保证它在任何给定时间实际运行。
使用-Xmx
和-Xms
参数调用程序时,可以在命令行上增加分配给JVM的内存。此外,如果您不在32位窗口上,请确保使用64位JVM,因为32位具有内存限制,而前者则没有。从命令行运行java -version
以查看当前系统JVM。
你可以将你的byte []缓冲区的声明移到你的循环之外(在while
之上),这样它就会被清除并在每次迭代时重用。
Iterator iter = itemList.keySet().iterator();
numJKLs = 0;
byte[] buffer;
while (iter.hasNext()) {
...
buffer = new byte[] ...
...
}
您要处理的文件有多大?你真的需要将它们中的每一个添加到levels
变量中吗?您可以使用某些文件信息或统计信息吗?你的JVM目前分配了多少RAM?
要查看当前内存使用情况,您需要在运行时调试程序。查看如何为您选择的IDE做到这一点,并且您将能够在整个程序的生命周期内遵循任何对象的当前状态。