在我的程序中,我需要检查1000+文件的1000+哈希,但不幸的是,由于某种原因,它会导致巨大的内存泄漏。有办法优化我的代码吗?
(我尝试过 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])));
} 发布于 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。所以,也许在目录中,除了文件之外,还有其他的东西正在抛出(例如,无限循环符号链接、应答点等等)。
发布于 2013-08-25 23:36:39
在我的评论中,您应该确保关闭文件流以防止内存泄漏:
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
}
}
}
}https://stackoverflow.com/questions/18434579
复制相似问题