gpt4 book ai didi

java - 获取 Java OutOfMemoryError : Java heap space error that I can't debug

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:17 26 4
gpt4 key购买 nike

我正在努力找出导致此 OutofMemory 错误的原因。提供更多可用内存不是解决方案,因为我的系统没有足够的内存。相反,我必须想出一种重写代码的方法。

我已简化我的代码以尝试隔离错误。请查看以下内容:

File[] files = new File(args[0]).listFiles();

int filecnt = 0;

LinkedList<String> urls = new LinkedList<String>();

for (File f : files) {
if (filecnt > 10) {
System.exit(1);
}

System.out.println("Doing File " + filecnt + " of " + files.length + " :" + f.getName());

filecnt++;
FileReader inputStream = null;
StringBuilder builder = new StringBuilder();

try {
inputStream = new FileReader(f);
int c;
char d;

while ((c = inputStream.read()) != -1) {
d = (char)c;
builder.append(d);
}
}

finally {
if (inputStream != null) {
inputStream.close();
}
}

inputStream.close();

String mystring = builder.toString();
String temp[] = mystring.split("\\|NEWandrewLINE\\|");

for (String s : temp) {
String temp2[] = s.split("\\|NEWandrewTAB\\|");
if (temp2.length == 22) {
urls.add(temp2[7].trim());
}
}
}

我知道这段代码可能很困惑 :) 我在 args[0] 指定的目录中有大量文本文件。这些文本文件是我创建的。我用了 |NEWandrewLINE|指示文本文件中的新行,以及 |NEWandrewTAB|以指示一个新列。在此代码片段中,我试图访问每个存储行的 URL(位于每行的第 8 列)。所以,我阅读了整个文本文件。字符串拆分 |NEWandrewLINE|然后在 |NEWandrewTAB| 上的子字符串上再次拆分字符串。我使用以下行将 URL 添加到 LinkedList(称为“urls”):urls.add(temp2[7].trim())

现在,运行这段代码的输出是:

Doing File 0 of 973 :results1322453406319.txt
Doing File 1 of 973 :results1322464193519.txt
Doing File 2 of 973 :results1322337493419.txt
Doing File 3 of 973 :results1322347332053.txt
Doing File 4 of 973 :results1322330379488.txt
Doing File 5 of 973 :results1322369464720.txt
Doing File 6 of 973 :results1322379574296.txt
Doing File 7 of 973 :results1322346981999.txt
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at Twitter.main(Twitter.java:86)

主线 86 与线 builder.append(d) 相关;在这个例子中。

但我不明白的是,如果我注释掉 urls.add(temp2[7].trim()); 这行我没有收到任何错误。所以错误似乎是由链表“urls”过度填充引起的。但为什么报告的错误与 StringBuilder 相关?

最佳答案

尝试将 urls.add(temp2[7].trim()); 替换为 urls.add(new String(temp2[7].trim()));.

我想你的问题是你实际上存储了整个文件内容,而不仅仅是你的 urls 列表中提取的 URL 字段,尽管这不是很明显。这实际上是 String 类的一个特定于实现的问题,但通常 String#split 和 String#trim 返回新的 String 对象,这些对象包含与原始字符串相同的内部 char 数组,只是它们的偏移量和长度字段不同。使用 new String(String) 构造函数可确保您只保留原始数据的相关部分。

关于java - 获取 Java OutOfMemoryError : Java heap space error that I can't debug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743166/

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