我有一个包含整数的大 txt 文件。文件中的每一行都有两个由空格分隔的整数。文件大小为 63 Mb。
Pattern p = Pattern.compile("\\s");
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] tokens = p.split(line);
String s1 = new String(tokens[0]);
String s2 = new String(tokens[1]);
int startLabel = Integer.valueOf(s1) - 1;
int endLabel = Integer.valueOf(s2) - 1;
Vertex fromV = vertices.get(startLabel);
Vertex toV = vertices.get(endLabel);
Edge edge = new Edge(fromV, toV);
fromV.addEdge(edge);
toV.addEdge(edge);
edges.add(edge);
System.out.println("Edge from " + fromV.getLabel() + " to " + toV.getLabel());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:203)
at java.lang.String.substring(String.java:1913)
at java.lang.String.subSequence(String.java:1946)
at java.util.regex.Pattern.split(Pattern.java:1202)
at java.util.regex.Pattern.split(Pattern.java:1259)
at SCC.main(SCC.java:25)
为什么我会收到此异常?如何更改我的代码以避免它?
编辑:我已经将堆大小增加到 2048m。什么在消耗它?这也是我想知道的。
据我所知,jvm 应该为顶点列表、边集、缓冲读取器的缓冲区和一个小字符串“line”分配内存。我看不出这个 outOfMemory 是从哪里来的。
我阅读了有关 string.split() 方法的信息。我认为它会导致内存泄漏,但我不知道该怎么办。