jvm如何以及何时何地更改Linux的最大打开文件值?
在linux中,每个登录用户的每个进程的最大打开文件数有一个限制,如下所示:jvm如何以及何时何地更改Linux的最大打开文件值?,jvm,ulimit,Jvm,Ulimit,在linux中,每个登录用户的每个进程的最大打开文件数有一个限制,如下所示: $ ulimit -n 1024 当我学习JavaNIO时,我想检查这个值。因为通道在Linux中也是一个文件,所以我编写了一个客户端代码来连续创建socketChannel,直到抛出以下异常: java.net.SocketException: Too many open files at sun.nio.ch.Net.socket0(Native Method) at sun.nio.ch.Net.socket(
$ ulimit -n
1024
当我学习JavaNIO时,我想检查这个值。因为通道在Linux中也是一个文件,所以我编写了一个客户端代码来连续创建socketChannel,直到抛出以下异常:
java.net.SocketException: Too many open files
at sun.nio.ch.Net.socket0(Native Method)
at sun.nio.ch.Net.socket(Net.java:423)
at sun.nio.ch.Net.socket(Net.java:416)
at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:104)
at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:60)
at java.nio.channels.SocketChannel.open(SocketChannel.java:142)
有人知道jvm何时何地以及如何更改此值吗?是否存在一些系统日志来记录此更改,或者某些系统工具可以监视此更改
$ strace -f -o HelloWorld.strace java HelloWorld
Hello World!
$ vi HelloWorld.strace
...
16341 getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
16341 setrlimit(RLIMIT_NOFILE, {rlim_cur=4*1024, rlim_max=4*1024}) = 0
...
下载openjdk,然后将cd放入hotspot目录
$ grep -r setrlimit
...
src/os/linux/vm/os_linux.cpp: status = setrlimit(RLIMIT_NOFILE, &nbr_files);
...
$ vi src/os/linux/vm/os_linux.cpp
...
if (MaxFDLimit) {
// set the number of file descriptors to max. print out error
// if getrlimit/setrlimit fails but continue regardless.
struct rlimit nbr_files;
int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
if (status != 0) {
if (PrintMiscellaneous && (Verbose || WizardMode))
perror("os::init_2 getrlimit failed");
} else {
nbr_files.rlim_cur = nbr_files.rlim_max;
status = setrlimit(RLIMIT_NOFILE, &nbr_files);
if (status != 0) {
if (PrintMiscellaneous && (Verbose || WizardMode))
perror("os::init_2 setrlimit failed");
}
}
...
如果您修改上述代码,例如
//nbr_files.rlim_cur = nbr_files.rlim_max;
nbr_files.rlim_cur = 2048;
然后重建这个openjdk,然后使用这个新的jdk来执行上面的代码,您会发现输出是2048
//nbr_files.rlim_cur = nbr_files.rlim_max;
nbr_files.rlim_cur = 2048;