当前位置: 首页 > 知识库问答 >
问题:

在linux中从jvm中查找硬的和软的打开文件限制(ulimit-n和ulimit-hn)

匡祖鹤
2023-03-14
$ ulimit -n
1024
$ ulimit -Hn
4096
groovy> ['bash', '-c', 'ulimit -n'].execute().text  
Result: 4096

groovy> ['bash', '-c', 'ulimit -Hn'].execute().text 
Result: 4096
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

public class LinuxInteractor {
    public static int executeCommand(String command, boolean waitForResponse, OutputHandler handler) {
        int shellExitStatus = -1;
        ProcessBuilder pb = new ProcessBuilder("bash", "-c", command);
        pb.redirectErrorStream(true);
        try {
            Process shell = pb.start();

            if (waitForResponse) {

                // To capture output from the shell
                InputStream shellIn = shell.getInputStream();

                // Wait for the shell to finish and get the return code
                shellExitStatus = shell.waitFor();

                convertStreamToStr(shellIn, handler);
                shellIn.close();
            }
        }

        catch (IOException e) {
            System.out
                    .println("Error occured while executing Linux command. Error Description: "
                            + e.getMessage());
        }
        catch (InterruptedException e) {
            System.out
                    .println("Error occured while executing Linux command. Error Description: "
                            + e.getMessage());
        }
        return shellExitStatus;
    }

    public static String convertStreamToStr(InputStream is, OutputHandler handler) throws IOException {

        if (is != null) {
            Writer writer = new StringWriter();

            char[] buffer = new char[1024];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is,
                        "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    String output = new String(buffer, 0, n);
                    writer.write(buffer, 0, n);

                    if(handler != null)
                        handler.execute(output);
                }
            } finally {
                is.close();
            }
            return writer.toString();
        } else {
            return "";
        }
    }

    public abstract static class OutputHandler {
        public abstract void execute(String str);
    }

    public static void main(String[] args) {
        OutputHandler handler = new OutputHandler() {
            @Override
            public void execute(String str) {
                System.out.println(str);
            }
        };

        System.out.print("ulimit -n : ");
        LinuxInteractor.executeCommand("ulimit -n", true, handler);
        System.out.print("ulimit -Hn : ");
        LinuxInteractor.executeCommand("ulimit -Hn", true, handler);
    }

}

此程序的输出:

$ java LinuxInteractor 
ulimit -n : 4096

ulimit -Hn : 4096

为什么在Java中的行为是相同的。是java设置ulimit。提前谢了。

共有1个答案

颛孙天宇
2023-03-14

Groovy在它的启动脚本中将这个限制设置为最大。

StartGroovy:160中:

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query businessSystem maximum file 
              descriptor limit: $MAX_FD_LIMIT"
    fi
fi

结果是jvm自己设置了这个限制。我不知道为什么groovy也要改变它。尝试:

java -XX:-MaxFDLimit LinuxInteractor
 类似资料:
  • 问题内容: 目前显示。我想将其增加到。我已经编辑了“ /etc/sysctl.conf”并放入了。我还编辑和更新了硬值和软值。但是ulimit仍然显示。完成所有这些更改后,我重新启动了笔记本电脑。我可以访问root密码。 在-中添加了以下几行 我还添加了以下内容- 我已经尝试了其他论坛上给出的所有可能方式,但是我可以达到的最大限制,不能超过此上限。可能是什么问题? 我进行此更改是因为引发最大打开文

  • 我有一个linux用户,软虚拟内存限制(ulimit-v)设置为aroud 5GB。 考虑到这一点,我试着做: 我的问题是:我关于ulimit-v>=VmSizes之和的假设正确吗?如果不是,软限制实际上是什么意思?是否有可能超过特定用户的软限制,并仍然可以接受它? 顺便说一句,ulimit-v-h被设置为unlimited,这有什么不同。

  • 问题内容: 我的目的是从golang程序中设置ulimit -n,这样我就不必全局设置它,而将其限制在程序中。 找到相同的系统调用setrlimit和get rlimit。(http://linux.die.net/man/2/setrlimit) 但是,当我尝试使用相同的示例程序时,在设置值时出现错误,提示参数无效。 获得的输出为: 因此,我能够获得rlimit设置限制失败并返回错误。即使失败,

  • 问题内容: 运行我的应用程序时,有时会出现关于的错误。 运行报告该限制为1024。如何将限制增加到1024以上? 编辑 导致权限错误。 问题答案: 您可以随时尝试执行。这只会重置当前shell的限制,并且您指定的数字不得超过硬限制 每个操作系统在配置文件中都有不同的硬限制设置。例如,可以在从/etc/system引导时设置Solaris上的硬打开文件限制。 在OS X上,必须在/etc/sysct

  • 我搜索了一个关于这个的现有问题/答案,但没有找到任何东西。 ulimit在Linux上提供的信息是否可以在跨平台本机Java代码中使用?

  • 问题内容: 我在linux ubuntu 17.10上运行代码 此代码返回“无限” 但是每当我从终端运行命令时,我都会得到1024。 为什么这些数字不同? 问题答案: 如果从命令行运行相同的命令,则会得到相同的结果: 这是因为仅查看紧随其后的参数。的不是此参数的一部分,并且被代替而不是分配作为位置参数()。 要运行,需要成为该参数的一部分: 换句话说,您应该使用: