首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环MD5散列文件会导致内存泄漏

循环MD5散列文件会导致内存泄漏
EN

Stack Overflow用户
提问于 2013-08-25 23:00:30
回答 2查看 978关注 0票数 0

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

(我尝试过 FastMD5、java.nio、java.io等。问题不是实际的代码)

代码语言:javascript
复制
        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])));

        } 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-04 18:38:51

我是您当前代码所使用的FastMD5库的作者。我试着在你的问题上添加这个评论,但是Stack Overflow说它太长了,所以我把它作为一个答案,希望它足够接近让你解决这个问题。我试着复制错误,但是你给出的示例代码对我来说很好。我创建了一个包含10,000个文件的目录,如下所示:

# mkdir bigdir

# $I=0 ; while test $I -lt 10000 ; do echo $I > bigdir/$I ; done

运行您的代码,按预期打印10,000个散列,JVM正常退出。

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

在我的“~/Download/”文件夹上第一次尝试您的代码时,我注意到一件事是,当它在目录列表中遇到一个实际上是目录本身的项时,它抛出了一个IOException。所以,也许在目录中,除了文件之外,还有其他的东西正在抛出(例如,无限循环符号链接、应答点等等)。

票数 1
EN

Stack Overflow用户

发布于 2013-08-25 23:36:39

在我的评论中,您应该确保关闭文件流以防止内存泄漏:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
            }
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18434579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档