Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM在持续运行shell脚本时进入睡眠状态_Java_Linux_Bash_Shell_Jvm - Fatal编程技术网

Java JVM在持续运行shell脚本时进入睡眠状态

Java JVM在持续运行shell脚本时进入睡眠状态,java,linux,bash,shell,jvm,Java,Linux,Bash,Shell,Jvm,我有几个shell脚本需要一个接一个地运行,Java需要获取错误和输出流。我想确保每个shell只在前一个shell完成时执行。我试过这个,它在很多情况下都能正常工作。但有些shell脚本的容量超过10到50MB。当我执行此操作时,JVM挂起。我尝试了ProcessBuilder和Runtime。两者都提供了相同的结果。我认为JVM进入退出状态。当我运行shell脚本时,它正在普通终端中运行。只有在从Java运行时,才会出现一些问题。我尝试了两种类型的代码,如下所示 Runtime.getRun

我有几个shell脚本需要一个接一个地运行,Java需要获取错误和输出流。我想确保每个shell只在前一个shell完成时执行。我试过这个,它在很多情况下都能正常工作。但有些shell脚本的容量超过10到50MB。当我执行此操作时,JVM挂起。我尝试了ProcessBuilder和Runtime。两者都提供了相同的结果。我认为JVM进入退出状态。当我运行shell脚本时,它正在普通终端中运行。只有在从Java运行时,才会出现一些问题。我尝试了两种类型的代码,如下所示

Runtime.getRuntime().freeMemory();
Runtime.getRuntime().runFinalization();
Runtime.getRuntime().gc();
String[] envp = {"WORK_HOME="+Cisma.constant.getWork_home_directory(),                      "BUILD_DIR="+Cisma.constant.getWork_home_directory()+"verif/compile/build"};
Process p = Runtime.getRuntime().exec(commands, envp); //hangs in this line
p.waitFor();
result.add(Output, getOutput(p));
result.add(Error, getError(p));
System.out.println(commands[0]+"End "+p.exitValue()); //printing 0, for our hang state it does not go to this line
Runtime.getRuntime().freeMemory();
Runtime.getRuntime().runFinalization();
Runtime.getRuntime().gc();
p.destroy();
我用的另一种方法是

ProcessBuilder pb = new ProcessBuilder(commands);
pb.directory(new File(working_directory));
pb.environment().put("WORK_HOME", Cisma.constant.getWork_home_directory());
pb.environment().put("BUILD_DIR", Cisma.constant.getWork_home_directory()+"verif/compile/build");
//pb.inheritIO(); // tried but did not work
//File f = new File ("temp");
//pb.redirectError(f);
//File o = new File ("temp1");
//pb.redirectOutput(o);
Process p = pb.start(); // hangs in this line
p.getOutputStream().flush();
p.waitFor();
p.destroy();
我的项目名称是CISMA_,主要是在com.CISMA.CISMA

src/apb_test17% /bin/ps -edf | grep java
jeevan    5263  5262  7 11:47 ?        00:03:13 /usr/bin/java -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m -jar /home/jeevan/Application/eclips
jeevan    7818  5263  0 12:21 ?        00:00:03 /usr/java/jdk1.8.0_31/bin/java -Dfile.encoding=ANSI_X3.4-1968 -classpath /home/jeevan/workspace/CISMA_Regression/target
jeevan    9751  6681  0 12:29 pts/10   00:00:00 grep --color=auto java
src/apb_test17% top -b -n1 | grep 5263
 5263 jeevan    20   0 6016600 675364  54836 S 0.000 8.296   3:14.08 java
src/apb_test17% ps -edf | grep java
jeevan    5263  5262  5 11:47 ?        00:03:35 /usr/bin/java -Dosgi.requiredJavaV
jeevan    7818  5263  0 12:21 ?        00:00:04 /usr/java/jdk1.8.0_31/bin/java -Df
jeevan   10324  6681  0 12:50 pts/10   00:00:00 grep --color=auto java

有人能帮我吗?

通过jconsole检查内存,jconsole将在jdk中提供。 使用以下命令增加jvm

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size
-Xms设置初始Java堆大小
-Xmx设置最大Java堆大小
-Xss设置java线程堆栈大小

链接

检查java消耗的内存量。如果它消耗更多内存,请尝试使用jvm标志来增加内存。因此,如果像第二个方法中的注释代码那样重定向进程的标准输出和错误输出,它仍然不起作用?如果没有重定向(就像在您的第一段代码中一样),这将是完全正常的。@Shriram:在Linux中如何做到这一点?@PhilippWendler:我尝试了各种重定向,但都不起作用。您确定它挂在
start
方法中而不是
waitFor
中吗?你怎么查到的?(您可以在命令行上使用
jstack
获取堆栈跟踪。)我怀疑这是否与JVM的堆或堆栈大小有关,因为启动进程不会消耗大量内存,除非您读取进程的大量输出,如果将输出重定向到文件,则不会发生这种情况。@PhilippWendler:我认为输出、输入和错误流溢出。@Jeevan是的,这是意料之中的,并且会显示此问题,但如果将它们重定向到文件,则不会发生这种情况(重定向到文件不需要JVM中的内存)。在您从Java向输入流中写入内容之前,输入流无法溢出。@PhillippWender:是否有可能将所有内容重定向到NULL?您应该可以使用
新文件(“/dev/NULL”)
,但任何其他文件也可以(您可以检查写入该文件的内容)。