当前位置: 首页 > 面试题库 >

OSX上的Java文件限制低于bash中的Java文件限制

呼延德华
2023-03-14
问题内容

我增加了Macbook Pro的最大文件限制,以便Elasticsearch可以处理更多文件,但是不起作用。

我运行命令’ulimit -a’,它说“打开文件”是100,000。我可以运行一个简单的shell脚本,如下所示:

export counter=0
while (true) ; do touch "/tmp/foo${counter}" ; export counter=`expr $counter + 1` ; done

而且我能够创建很多文件(在杀死脚本之前已超过60,000)。

但是,使用Java代码在“ /
tmp”目录的空子目录中创建RandomAccessFiles,在得到错误之前,我只能制作10232个文件:java.io.FileNotFoundException(打开的文件太多)。这是我的Java代码:

import java.io.*;
import java.util.*;

public class max_open_files {
    public static void main(String ... args) throws Exception {
        File testDir = new File("/tmp/tempsubdir");
        testDir.mkdirs();

        List<File> files = new LinkedList<File>();
        List<RandomAccessFile> fileHandles = new LinkedList<RandomAccessFile>();

        try {
            while (true) {
                File f = new File(testDir, "tmp" + fileHandles.size());
                RandomAccessFile raf = new RandomAccessFile(f, "rw");
                files.add(f);
                fileHandles.add(raf);
            }
        } catch (Exception ex) {
            System.out.println(ex.getClass() + " " + ex.getMessage());
        }

        for (RandomAccessFile raf : fileHandles) raf.close()

        for (File f : files) f.delete();

        System.out.println("max open files: " + fileHandles.size());
    }
}

此Java代码类似于Elasticsearch中测试文件数量限制的代码(在maxOpenFiles方法的FileSystemUtils类中)。因此,Elasticsearch具有我的Java程序同样的问题。

为什么shell脚本可以生成比Java代码(mine和Elasticsearch的)更多的文件?为什么对Java文件无法识别的文件数量有较高的系统限制?

CDT
5月13日下午4:50更新:我创建了一个C版本的测试程序,以查看该限制是否特定于Java,并且看起来确实如此。下面的C版本可以打开32,765个文件,而Java代码限制为10,232个文件。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv) {
    char name[100];
    FILE *fp;
    int ndx;

    for (ndx = 0; ndx < 50000; ndx++) {
        sprintf(name, "/tmp/foo%d.txt", ndx);
        fp = fopen(name, "w");
        if (fp == NULL) {
            fprintf(stdout, "Can not create file %d\n", ndx);
            return 1;
        }
        fprintf(fp, "hello %d", ndx);
    }

    return 0;
}

问题答案:

适用于Mac的Java虚拟机选项参考

-XX:-MaxFDLimit

指示VM不要将文件描述符限制设置为默认最大值。默认行为是将限制设置为OPEN_MAX指定的值,即10240。通常,这是一个进程可能已打开的最大文件数。但是,可以使用sysctl实用程序将此限制增加到用户指定的值。在这种情况下,您可能希望传递-
XX:-MaxFDLimit来阻止Java VM将打开文件的数量限制为10240。



 类似资料:
  • 问题内容: 问题: 在我的Java应用程序(不是applet)中,我希望将某些文件操作限制在所有类之外,但不应限制类的列表/组/包。 具体来说,我想限制… 文件读取 文件写入 档案建立 文件删除 …这样它们只能在当前工作目录中对所有非受限类进行处理。 SecurityManager尝试: 我尝试实现实现此行为的SecurityManager类的子类,但是似乎在进行检查时,所提供的 文件 信息所提供

  • 问题内容: 以下问题仅适用于bash和linux: 文件的绝对路径名中的字符数是否有限制? 仅文件名(无扩展名)的字符数有限制吗? 如果是这样,这些限制是什么?如果它们是系统特定的,我该如何访问它们? 问题答案: 这在很大程度上取决于文件系统。对于ext FS(当前在Linux上最常用): 文件名最大长度:255个字节 最大路径长度:无 FS不能识别该扩展名,它包含255个字节,包括扩展名(您可以

  • 提前感谢你的帮助

  • 问题内容: 有没有一种方法可以将文本字段限制为仅允许数字0-100,从而排除字母,符号等?我已经找到了一种方法,但是它比看起来必要的方法复杂得多。 问题答案: 如果必须使用文本字段,则应将JFormattedTextField与NumberFormatter一起使用。您可以设置NumberFormatter上允许的最小值和最大值。 但是,Johannes建议使用JSpinner(如果适合您的用例)

  • 我使用filter和sortBy的想法失败了,因为它不能一次轮询所有文件。 也许这不是Camel需要解决的问题,但由于它已经知道如何通过SFTP连接和删除文件,所以我想重用它的功能。

  • 我正在使用vaadin(7.1.9)的upload组件,现在我的问题是我无法限制哪种文件可以与upload组件一起发送到服务器,但我没有找到任何用于此目的的API。唯一的方法是丢弃错误类型的文件后上传。 这是一种正确的方式吗?