【发布时间】:2012-05-24 00:21:13
【问题描述】:
我正在尝试寻找不使用 fork 的 Java Runtime.exec() 替代方案。问题是我们的 JVM 消耗了大部分内存,并且该进程上的 Runtime.exec 分叉可能会导致内存问题,即使在写入时复制和过度使用时也是如此(这在 stackoverflow 中经常讨论,请参阅Java Runtime.getRuntime().exec() alternatives)。
在另一个 stackoverflow 帖子中,提出了使用 JNA 的解决方案,但该解决方案上没有 cmets,并且评价不高:How to solve "java.io.IOException: error=12, Cannot allocate memory" calling Runtime#exec()?
这里也建议了类似的 JNA 解决方案:http://sanjitmohanty.wordpress.com/2011/12/20/overcoming-runtime-exec-havoc-with-jna/
我的问题是:使用 JNA 进行系统调用是否会阻止分叉,是否避免了分叉可能导致的后续内存分配问题?这是我正在使用的代码:
public class TestJNA {
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int system(String cmd);
}
private static int exec(String command) {
return CLibrary.INSTANCE.system(command);
}
public static void main(String[] args) {
exec("ls");
}
【问题讨论】: