gpt4 book ai didi

java - 需要对低内存系统上的 Runtime.getRuntime.exec() 进行故障排除吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:43 27 4
gpt4 key购买 nike

我们的 Web 应用程序正在使用 Process myProcess = Runtime.getRuntime.exec(cmd)。目前它使用 Ubuntu Linux 上托管的 Tomcat 进行部署。

该应用程序在我的开发机器(Core2 duo,2GB RAM 操作系统: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

...

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

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

此问题是否是由于虚拟服务器上的物理内存不足(导致 getRunTime 失败)引起的,或者我在这里遗漏了一些东西。任何工具、命令或方法来根本原因问题。

感谢您的意见!

最佳答案

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

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

关于java - 需要对低内存系统上的 Runtime.getRuntime.exec() 进行故障排除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com