我的Web应用程序是使用Process myProcess = Runtime.getRuntime.exec(cmd)。 它目前使用托管在Ubuntu Linux上的Tomcat进行部署。
此应用程序在我的开发机器上运行正常(Core2 duo,2GB RAM OS:UBUNTU 11.04)。
但是,当我在虚拟服务器(1GB RAM,Xeon处理器)上托管相同内容时,Runtime.getRuntime.exec(cmd)调用失败。它无法创建子流程。
创建了相同的子流程,我们在开发机器上获得了预期的输出。
在应用程序中,我们调用部署在tomcat中的servlet中的java类执行良好,输出正常。下面是相同的代码片段。
from the servlet
uploadservlet.java
+-----------+
CalculateDuration dur=new CalculateDuration();
Map<String, Integer> durationmap=dur.conversion(al);
+-------------+
Caclulateduration.java
+------------------+
{
conversion(ArrayList<String> b)
{
StringBuilder sb = new StringBuilder();
sb.append( "hello.o"); /* Name of the sample executable */
...
Process p = Runtime.getRuntime().exec(sb.toString() ); //struck at this line.subprocess not created on my vps system
...
+------------------+
Standalone Caclulateduration.java在虚拟服务器上运行。
这个问题可能是由于虚拟服务器上的物理内存不足(导致getRunTime失败)造成的,或者我在这里遗漏了一些东西。任何用于root的工具,命令或方法都会导致此问题 问题。
您的意见非常感谢!
答案 0 :(得分:0)
1.7之前的Java Runtime.exec()
使用fork()/exec()
来生成进程。分叉意味着复制当前进程,这可能是一个巨大的Java应用程序。为了能够fork()一个应用程序,您需要有足够的虚拟地址空间。多少取决于您的操作系统内存过量使用设置。
为了避免所有这些麻烦,Java 1.7(Sun / OpenJDK / ...)支持vfork()/exec()
和posix_spawn()
。 posix_spawn()
直接生成一个新进程,而vfork()
在父进程和子进程之间共享内存直到即将发生execve()
,因此它们不需要那么多的虚拟地址空间来工作。