我目前在 Weblogic Java EE 项目中工作,应用程序有时会执行 Perl 脚本来执行一些批处理作业。在应用程序中,脚本被调用为
Process p = Runtime.getRuntime().exec(cmdString);
虽然这是一种危险的运行方式,但在我们需要在for循环下同步执行脚本之前,它一直在正常工作。经过几次运行,我们得到
java.io.IOException: Not enough space
因为可能操作系统在 for 循环下执行时虚拟内存不足。因此,我们根本无法在服务器中运行该脚本。
我正在拼命寻找一种更安全、更好的方式来运行 Perl 脚本,我们不需要 fork 父进程,或者至少不需要吃掉所有交换空间!
规范如下:
Appserver - Weblogic 9.52
JDK - 1.5
OS - SunOS 5.10
Sun-Fire-T200
最佳答案
我遇到过几次类似的事情。由于子进程是(非常大的父进程的一个分支,它可以看到它所有共享它的所有内存(使用写时复制)。我发现内核需要能够确保它可以复制所有的在 fork 子进程之前的内存页面,在 32 位操作系统上你用完虚拟头运行得非常快。
可能的解决方案:
- 使用 64 位操作系统和 JVM,将问题推到目前为止没关系
- 在另一个进程(如 HTTPD)中托管您的脚本,并使用 HTTP 请求调用它
关于java - 从 weblogic Java EE 应用程序运行 Perl 脚本的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784543/