0

在我们的 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 

      ...

          +------------------+

独立 Caclulated.java 在虚拟服务器上运行。

这个问题可能是因为虚拟服务器上的物理内存不足(导致 getRunTime 失败)还是我在这里遗漏了一些东西。任何工具、命令或方法都可以根除此问题。

感谢您的意见!

4

1 回答 1

0

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

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

于 2012-11-23T20:24:40.083 回答