У меня есть следующий класс 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: предел ГХ накладных расходов превысил на java.util.regex.Pattern.compile (Pattern.java:1469) в java.util.regex.Pattern (Pattern. .java: 1150) на java.util.regex.Pattern.compile (Pattern.java:840) на java.lang.String.split (String.java:2304) на java.lang.String.split (строка .java: 2346) at LCAReader.main (LCAReader.java:17)
Входной файл почти 2G, а машина, на которой я запускал программу, имеет память 8G. Я также попробовал параметр -Xmx4096m для запуска программы, но это не помогло. Поэтому я думаю, что в моем коде есть утечка памяти, но я не могу их найти.
Может ли кто-нибудь помочь мне в этом? Заранее спасибо!
Одно слово предостережения о переходе 'new String()' при использовании 'String.split()'. Если вам нужны только несколько токенов из результатов 'String.split()', часто бывает неплохо использовать 'new String()', потому что 'Strings', возвращаемые' String.split() ', являются просто обертками, которые верните все строки разделения. Таким образом, вы оставите свою целую цепочку в куче, когда все, что вам нужно, - это несколько ее частей (здесь не так много, потому что он использует все в 'String', но' 't' separators). – ulmangt
Я пробовал метод intern() и увеличил размер кучи до 6G, и никаких исключений не было. Из использования памяти я вижу, что он все еще использует много памяти. Таким образом, увеличение размера кучи помогло, и метод intern() мало помог. Благодаря! – Wei