在我的系统上,我无法运行启动进程的简单Java应用程序.我不知道该怎么解决.
你能给我一些如何解决的提示吗?
该计划是:
[root@newton sisma-acquirer]# cat prova.java
import java.io.IOException;
public class prova {
public static void main(String[] args) throws IOException {
Runtime.getRuntime().exec("ls");
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
[root@newton sisma-acquirer]# javac prova.java && java -cp . prova
Exception in thread "main" java.io.IOException: Cannot run program "ls": java.io.IOException: error=12, Cannot allocate memory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:474)
at java.lang.Runtime.exec(Runtime.java:610)
at java.lang.Runtime.exec(Runtime.java:448)
at java.lang.Runtime.exec(Runtime.java:345)
at prova.main(prova.java:6)
Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
at java.lang.ProcessImpl.start(ProcessImpl.java:81)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:467)
... 4 more
Run Code Online (Sandbox Code Playgroud)
系统配置:
[root@newton sisma-acquirer]# java -version …Run Code Online (Sandbox Code Playgroud) 我试图创建一个调用外部程序的应用程序,我必须传递两个参数.它没有给出任何错误.用c ++编写的program.exe拍照并修改了txt文件的内容.java程序运行但它什么也没做
这是我的示例代码
String[] params = new String [3];
params[0] = "C:\\Users\\user\\Desktop\\program.exe";
params[1] = "C:\\Users\\user\\Desktop\\images.jpg";
params[2] = "C:\\Users\\user\\Desktop\\images2.txt";
Runtime.getRuntime().exec(params);
Run Code Online (Sandbox Code Playgroud) 在工作中,我们的一个目标平台是运行Linux的资源受限的迷你服务器(内核2.6.13,基于旧的Fedora Core的自定义分发).该应用程序是用Java编写的(Sun JDK 1.6_04).Linux OOM杀手被配置为在内存使用超过160MB时终止进程.即使在高负载期间,我们的应用程序也永远不会超过120MB,并且与其他一些活跃的本机进程一起使用,我们仍然可以在OOM限制范围内.
但是,事实证明,Java Runtime.getRuntime().exec()方法是从Java执行外部进程的规范方法,在Linux上有一个特别不幸的实现,导致生成的子进程(暂时)需要相同数量的内存作为父进程,因为复制了地址空间.最终的结果是,一旦我们运行Runtime.getRuntime().exec(),我们的应用程序就会被OOM杀手杀死.
我们目前通过让一个单独的本机程序执行所有外部命令来解决这个问题,并通过套接字与该程序进行通信.这不是最佳的.
在网上发布了这个问题之后,我得到了一些反馈,表明这不应该发生在Linux的"更新"版本上,因为它们使用copy-on-write实现了posix fork()方法,可能意味着它只会复制它需要的页面在需要时修改而不是立即修改整个地址空间.
我的问题是: