读取大文件时GC开销限制超出

时间:2015-06-09 09:32:03

标签: java garbage-collection

我想逐行读取我的.csv文件,以防止我自己将所有内容一次加载到RAM中。我认为这是做到这一点的方法。我还以一种方式编写代码,在循环中没有声明变量来保存JVM始终创建新对象并运行垃圾收集器。

然而,我一直在遇到这种情况" GC开销有限超出"错误。我的CPU也运行近100%。

Here问题是由HashMap存储数百万个String对象引起的 - 但是我的应该只有"只有"存储大约20.000个Node对象。

请帮我找到代码中有问题的部分。错误报告下面源代码中标记的行。

这是我的代码:

HashMap<String,TweetNode> allNodes = new HashMap<String,TweetNode>();
    // read file
    try {
        BufferedReader br = new BufferedReader(new FileReader(graphFile));
        noOfNodes = 0;
        String line = br.readLine();
        String firstNode;
        String[] lineContent;
        while (line != null) {
            lineContent = line.split("\t"); // error occurs here!
            // always look at the first node
            firstNode = lineContent[0];
            if (! allNodes.containsKey(firstNode)) {
                allNodes.put(firstNode, new TweetNode(noOfNodes, firstNode));
                noOfNodes++;
            }
            allNodes.get(firstNode).addNeighbour(lineContent[1], Double.valueOf(lineContent[2]));
            line = br.readLine();
        }
        br.close();
    } 
    // ... catch stuff ...
return allNodes;
}

1 个答案:

答案 0 :(得分:0)

我在这里看到的唯一问题是你的地图。 Map正在填满堆内存。您应该使用低堆内存运行应用程序。通过访问以下参数来检查当前值,并将它们设置为合理的高值。

标志Xmx指定Java虚拟机(JVM)的最大内存分配池,而Xms指定初始内存分配池。