JAVA ulimit,java-从linux中的jvm中查找硬打开和软打开文件限制(ulimit -n和ulimit -Hn)
我有一個問題,我需要從Java / groovy程序中找出Linux中進程的硬打開和軟打開文件限制.當我從終端執行ulimit時,它將為硬打開文件限制和軟打開文件限制提供單獨的值.
$ulimit -n
1024
$ulimit -Hn
4096
但是,如果我以常規方式執行它,它將忽略軟限制并始終返回硬限制值.
groovy> ['bash', '-c', 'ulimit -n'].execute().text
Result: 4096
groovy> ['bash', '-c', 'ulimit -Hn'].execute().text
Result: 4096
如果我缺少什么,請告訴我.我已使用ubuntu 12.04,Groovy版本:1.8.4 JVM:1.6.0_29來執行此操作.
更新:
我在Java中嘗試過同樣的事情.
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嗎?
提前致謝.
解決方法:
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
它將禁用此行為.
標簽:groovy,jvm,ulimit,linux,java
來源: https://codeday.me/bug/20191101/1982240.html
總結
以上是生活随笔為你收集整理的JAVA ulimit,java-从linux中的jvm中查找硬打开和软打开文件限制(ulimit -n和ulimit -Hn)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5画布 文本无法显示,淡出HTM
- 下一篇: pythondjango网页开发_Pyt