java - 连续运行shell脚本时JVM进入休眠状态

标签 java linux bash shell jvm

我有几个 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_Regression 主要位于 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

有人可以帮我吗?

最佳答案

通过 jdk 中可用的 jconsole 检查你的内存。 使用以下命令增加您的 jvm。

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

链接 how to find memory in java

关于java - 连续运行shell脚本时JVM进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28272699/

相关文章:

java - Java 中来自 xml 的动态属性

C++ dll堆内存分配问题

python - 通过在文本文件中写入输出在 python 中调用 linux shell

bash - 无法在 macOS 上修改/etc/shells 以包含 brew 安装的 bash 版本

macos - 如何在 Mac OS X 上以编程方式挂起/恢复进程及其子进程?

Java jFrame 关闭按钮

java - 如果某些值不存在则插入到表中

linux - 如何在同一台 PC 上的 2 个进程之间查找套接字原始数据

linux bash脚本错误处理for循环

java - Java中如何解决这个异常?