【发布时间】:2015-11-01 06:43:06
【问题描述】:
在我的程序中,我像这样遍历一个目录及其子目录
public void foo(File file){
File filelist[] = file.listFiles();
for(File f: filelist){
if(f.isDirectory()) foo(f);
fun(f);
}
}
我收到太多打开的文件错误。我想知道 File 对象是否进入了空闲 inode 或其他错误。
我使用的是 ubuntu 14.04 64 位版本。 我在几个子目录中有 500 万个文件。 我为这个进程提供了 6GB 内存 (-Xmx6g)。
编辑:是的,问题出在我使用的 fun() 方法中
doc.writeTo(new FileWriter(file))
一般 GC 会处理它,但我有大量文件,所以 GC 为时已晚。
【问题讨论】:
-
所以错误在
f.isDirectory()?或fun(f)?你可以发布堆栈跟踪吗? -
在 fun(f) 中,我正在创建另一个用于写作的文件。
-
追加
fun(f)所做的并尝试追加堆栈跟踪 -
你没有说你在
fun(f)中做了什么,但最有可能的是,你打开一个文件,用它做一些事情,然后你忘记关闭它,这导致了一个巨大的递归列表打开和未关闭的文件。正确的?可能是这样的吗? -
'一般 GC 会处理它':不。这是不好的做法。 GC 并不打算为您关闭文件。如果你正在消耗资源,你应该尽快自己释放它们。