- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力找出导致此 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/
我是一名优秀的程序员,十分优秀!