gpt4 book ai didi

OSX 上的 Java 文件限制低于 bash

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:29:51 24 4
gpt4 key购买 nike

我增加了 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,在出现错误之前我只能创建 10,232 个文件: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中测试文件数量限制的代码(在FileSystemUtils类的maxOpenFiles方法中)。所以 Elasticsearch 和我的 Java 程序有同样的问题。

为什么 shell 脚本可以生成比 Java 代码(我的和 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;
}

最佳答案

Java Virtual Machine Option Reference for Mac

-XX:- MaxFDLimit

Directs the VM to refrain from setting the file descriptor limit to the default maximum. The default behavior is to set the limit to the value specified by OPEN_MAX, which is 10240. Normally, this is the maximum number of files that a process may have open. It is possible, however, to increase this limit to a user-specified value with the sysctl utility. Under such circumstances, you may want to pass -XX:-MaxFDLimit to stop the Java VM from restricting the number of open files to 10240.

关于OSX 上的 Java 文件限制低于 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com