我有以下JAVA类从包含许多制表符分隔字符串行的文件读取。一个例子是线类似如下:JAVA处理文件java.lang.OutOfMemoryError:GC开销限制超出错误
GO:0085044 GO:0085044 GO:0085044
该代码读取每一行,并使用分裂功能把三个子串到一个数组,然后它把它们放入一个两级散列。
public class LCAReader {
public static void main(String[] args) {
Map<String, Map<String, String>> termPairLCA = new HashMap<String, Map<String, String>>();
File ifile = new File("LCA1.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(ifile));
String line = null;
while((line=reader.readLine()) != null) {
String[] arr = line.split("\t");
if(termPairLCA.containsKey(arr[0])) {
if(termPairLCA.get(arr[0]).containsKey(arr[1])) {
System.out.println("Error: Duplicate term in LCACache");
} else {
termPairLCA.get(arr[0]).put(new String(arr[1]), new String(arr[2]));
}
} else {
Map<String, String> tempMap = new HashMap<String, String>();
tempMap.put(new String(arr[1]), new String(arr[2]));
termPairLCA.put(new String(arr[0]), tempMap);
}
}
reader.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
当我运行该程序时,运行一段时间后出现以下运行时错误。我注意到内存使用量不断增加。
在线程异常 “主要” java.lang.OutOfMemoryError:GC开销限制在java.util.regex.Pattern.compile(Pattern.java:1469) 在java.util.regex.Pattern中超过 (模式。 。java.lang.String.split(String.java:2304) at java.lang.String.split(String) (LCAReader.java:17)
输入文件几乎是2G,我运行程序的机器有8G内存。我也尝试了-Xmx4096m参数来运行该程序,但这并没有帮助。所以我想我的代码中有一些内存泄漏,但我找不到它们。
任何人都可以帮助我吗?提前致谢!
使用'String.split()'时,谨慎使用'new String()'的一个词。如果你只需要'String.split()'的结果中的几个标记,那么使用'new String()'通常是一个好主意,因为'String.split()'返回的'Strings'只是包装器指向整个拆分字符串。所以你最终会把你的整个字符串放在堆上,当你想要的只是它的一小部分时(这里没有什么大不了的,因为他使用'String'中的所有东西,而不是'\ t'分隔符)。 – ulmangt 2012-04-15 03:41:39
我尝试了intern()方法并将堆大小增加到6G,并没有显示异常。从内存使用情况来看,我可以看到它仍然使用大量的内存。所以增加堆大小帮助了很多,而intern()方法没有什么帮助。谢谢! – Wei 2012-04-16 02:42:56