gpt4 book ai didi

Java - 字节缓冲区内存不足

转载 作者:行者123 更新时间:2023-12-01 13:16:46 25 4
gpt4 key购买 nike

对 Java 有点陌生,但我已经能够很快地学到很多东西。但仍然有很多方法让我无法理解。我正在编写一个 Java 程序,该程序将运行一堆文件并彻底测试它们,看看它们是否是有效的关卡包文件。感谢 Matt Olenik 和他的 GobFile 类(仅用于提取文件),我能够找到一个很好的策略来获取关卡包的重要部分及其各个 map 文件,从而快速确定各种细节。然而,在 37 个文件(其中 5 个不是关卡包)上进行测试时,它在测试 35 个文件后崩溃了。第 35 个文件是有效的关卡包。它给出的错误是:

线程“main”中出现异常java.lang.OutOfMemoryError:Java堆空间

     Iterator iter = itemList.keySet().iterator();
numJKLs = 0;
while (iter.hasNext()) {
String nextFile = (String) iter.next();
if (nextFile.startsWith("jkl\\")) {
System.out.println(((ItemInfo) itemList.get(nextFile)).length);
--> byte[] buffer = new byte[((ItemInfo) itemList.get(nextFile)).length];
gobRaf.seek(((ItemInfo) itemList.get(nextFile)).offset);
gobRaf.read(buffer, 0,
((ItemInfo) itemList.get(nextFile)).length);
String[] content = new String(buffer).toLowerCase().split(
"\n");
levels.add(numJKLs, new JKLFile(theFile, nextFile, content));
gametype = levels.get(numJKLs).getFileType();
progress.setProgText(nextFile);
buffer = null;
content = null;
numJKLs++;
}
}

箭头显示标记错误的位置。 “JKLFile”类读取这些重要部分的 content 数组,但应该(理论上)在完成后将其丢弃。像这里一样,我在 JKLFile 中设置 content = null; 只是为了确保它消失了。如果您想知道它停止的 map 文件有多大,好吧,它成功地传递了一个 17 Mb 的 map 文件,但这个只有 5 Mb。

如您所见,这些 JKLFile 对象保存在该对象 (GobFile.java) 中,以便以后轻松访问,并且 GobFile对象保存在另一个类中以供以后访问,直到我更改目录(尚未实现)。但这些物体不应该装得太满。只是文件名和各种详细信息的列表。

关于如何找出内存的去向或哪些对象使用最多的资源,有什么建议吗?当我从列表中单击详细信息时,最好将详细信息保留在内存中,而不必再次加载文件(最多 2 秒)。

/爱德华

最佳答案

现在您正在为每个循环创建一个新的缓冲区。根据您的垃圾收集,其中一些可能无法从内存中回收/释放,然后您就会耗尽。您可以使用 System.gc() 调用垃圾收集器,但不能保证它在任何给定时间实际运行。

当使用 -Xmx-Xms 参数调用程序时,您可以在命令行上增加分配给 JVM 的内存。另外,如果您使用的不是 32 位 Windows,请确保您使用的是 64 位 JVM,因为 32 位有内存限制,而 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 执行此操作,您将能够在程序的生命周期中跟踪任何对象的当前状态。

关于Java - 字节缓冲区内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com