减少用Java代码打开的文件数

| 嗨,我有一些使用块的代码
RandomAccessFile file = new RandomAccessFile(\"some file\", \"rw\");
FileChannel channel = file.getChannel();

// some code
String line = \"some data\";
ByteBuffer buf = ByteBuffer.wrap(line.getBytes());
channel.write(buf);

channel.close();
file.close();
但是该应用程序的特定之处在于,我必须生成大量的临时文件,平均数量要超过4000(用于Hive插入分区表)。 问题是有时我会捕获异常
Failed with exception Too many open files
在应用运行期间。 如果有什么办法告诉OS该文件已关闭并且不再使用,我会很伤心,为什么
channel.close();
file.close();
不会减少打开的文件数。有什么办法可以用Java代码做到这一点? 我已经增加了已打开文件的最大数量
#/etc/sysctl.conf:
kern.maxfiles=204800
kern.maxfilesperproc=200000
kern.ipc.somaxconn=8096
更新: 我试图消除问题,所以我分开了代码以研究它的每个部分(创建文件,上载到配置单元,删除文件)。 使用类\'File \'或\'RandomAccessFile \'失败,例外情况为“打开的文件太多”。 最后,我使用了代码:
FileOutputStream s = null;
FileChannel c = null;

try {
    s = new FileOutputStream(filePath);
    c = s.getChannel();
    // do writes
    c.write(\"some data\"); 
    c.force(true);
    s.getFD().sync();

} catch (IOException e) {
    // handle exception
} finally {
    if (c != null)
        c.close();
    if (s != null)
        s.close();
}
这适用于大量文件(在20K上测试,每个文件大小均为5KB)。代码本身不会像前两个类一样引发异常。 但是生产代码(带有配置单元)仍然有例外。看来通过JDBC进行配置单元连接是其原因。 我将进一步调查。     
已邀请:
操作系统可以使用的打开文件句柄数量与进程可以打开的文件句柄数量不同。大多数Unix系统限制每个进程的文件句柄数。最有可能是JVM的1024个文件句柄。 a)您需要在启动JVM的外壳程序中将ulimit设置为更高的值。 (类似于\'ulimit -n 4000 \') b)您应确认没有任何资源泄漏导致文件无法“定稿”。     
确保使用finally {}块。如果由于某种原因而导致异常,那么关闭将永远不会在编写的代码中发生。     
这是确切的代码吗?因为我可以想到一种情况,您可能会循环打开所有文件并编写代码以最终关闭所有文件,这会导致此问题。请发布完整代码。     

要回复问题请先登录注册