为文件循环MD5哈希会导致内存泄漏

时间:2013-08-25 23:00:30

标签: java hash memory-leaks md5

在我的程序中,我需要检查1000多个文件的MD5哈希值,但不幸的是,由于某种原因,它会导致巨大的内存泄漏。 有没有办法优化我的代码?

我试过FastMD5,java.nio,java.io等。问题不是实际的代码

        File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();

        for(int i = 0; i < directory.length;i++){

        System.out.println(MD5.asHex(MD5.getHash(directory[i])));

        } 

2 个答案:

答案 0 :(得分:3)

扩展我的评论,这是你应该如何确保关闭文件流以防止内存泄漏:

final File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();
for(int i = 0; i < directory.length; i++)
{
    try(final FileInputStream file = new FileInputStream(directory[i]))
    {
        System.out.println(DigestUtils.md5Hex(file));
    }
    catch(final IOException ex)
    {
        ex.printStackTrace();
    }
}

或者,如果您不使用Java 7:

final File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();
for(int i = 0; i < directory.length; i++)
{
    FileInputStream file = null;
    try
    {
        file = new FileInputStream(directory[i]);
        System.out.println(DigestUtils.md5Hex(file));
    }
    catch(final IOException ex)
    {
        ex.printStackTrace();
    }
    finally
    {
        if(file != null)
        {
            try
            {
                file.close();
            }
            catch(final IOException ex)
            {
                //Ignore
            }
        }
    }
}

答案 1 :(得分:1)

我是您当前代码正在使用的FastMD5库的作者。我尝试将此添加为对您的问题的评论,但Stack Overflow表示它太长了,所以我将其作为答案发布,并希望它足够接近让您弄清楚问题。我尝试重现错误,但你提供的示例代码对我来说很好。我创建了一个包含10,000个文件的目录,如下所示:

# mkdir bigdir

# mkdir bigdir

运行代码按预期打印10,000个哈希值,JVM正常退出。

您可以发布您获得的特定堆栈跟踪吗?我怀疑它在MD5计算期间死亡并且内存泄漏可能在其他地方是巧合。如果您遇到特定于操作系统的错误,您是否也可以在不同的操作系统上尝试代码?

我第一次在“〜/ Downloads /”文件夹上尝试代码时注意到的一件事是,当它在目录列表中遇到实际上是目录本身的项时,它抛出了IOException。所以也许你在该目录中有一些不同于文件的东西(例如,无限循环符号链接,重新分析点等)。