需要在低内存系统上对Runtime.getRuntime.exec()进行故障排除的输入?

时间:2012-11-23 14:37:53

标签: java linux tomcat6

我的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的工具,命令或方法都会导致此问题 问题。

您的意见非常感谢!

1 个答案:

答案 0 :(得分:0)

1.7之前的Java Runtime.exec()使用fork()/exec()来生成进程。分叉意味着复制当前进程,这可能是一个巨大的Java应用程序。为了能够fork()一个应用程序,您需要有足够的虚拟地址空间。多少取决于您的操作系统内存过量使用设置。

为了避免所有这些麻烦,Java 1.7(Sun / OpenJDK / ...)支持vfork()/exec()posix_spawn()posix_spawn()直接生成一个新进程,而vfork()在父进程和子进程之间共享内存直到即将发生execve(),因此它们不需要那么多的虚拟地址空间来工作。