在Java中使用Scanner时如何减少内存泄漏?

时间:2015-06-03 03:26:36

标签: java memory-leaks java.util.scanner

我使用Scanner读取许多日志文件(~100个文件),每个日志文件大约120mb,并且有超过1,000,000行。用于读取日志文件的内存不断增加并导致内存过载。如何防止这种情况发生?这是我的代码:

File file = processing.poll(); // processing is a queue.
Scanner sc = new Scanner(file);
String line;
int lineCount = 0;
while (sc.hasNextLine()) {
    line = sc.nextLine();
}
sc.close();

谢谢!!

P / S:内存增加缓慢,每处理一个文件大约1mb,但我会将此代码推送到服务器,并且将来会有无数文件。

2 个答案:

答案 0 :(得分:2)

我建议您使用try-with-resources close Scanner并释放文件句柄。此外,您可以限制line的范围,我认为您的意思是增加lineCount。像,

int lineCount = 0;
try (Scanner sc = new Scanner(file)) {
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        lineCount++;
    }
}

或者,您可以使用像

这样的finally
int lineCount = 0;
Scanner sc = new Scanner(file);
try {
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        lineCount++;
    }
} finally {
    sc.close();
}

答案 1 :(得分:0)

问题是你正在将所有这些巨大的~100个日志文件加载到内存中。想一想。 ~100个日志文件,每个约120mb。这是一个很大的记忆!您将不得不在单个日志文件中读取,处理它,然后释放文件上的句柄并将其从内存中删除,然后重复,直到所有日志都按照您希望的方式处理。您需要一种算法来分别处理它们并根据需要释放句柄/内存以避免过载。