【问题标题】:Java File object makes entry to inode?Java File对象进入inode?
【发布时间】: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 并不打算为您关闭文件。如果你正在消耗资源,你应该尽快自己释放它们。

标签: java linux file recursion


【解决方案1】:

不,File 对象不会修改或保存 inode;它实际上只是文件系统上路径的表示。最有可能的是,fun(f) 正在打开文件并且从不关闭它们,并且操作系统限制了可以同时打开的文件数量。文件描述符限制与正在使用的内存量或磁盘空间无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2012-09-15
    • 1970-01-01
    • 2014-03-17
    • 2013-02-04
    • 2015-07-09
    • 2014-09-24
    • 2011-11-30
    相关资源
    最近更新 更多