我正在尝试寻找不使用 fork 的 Java Runtime.exec() 替代方案。问题是我们的 JVM 消耗了大部分内存,并且该进程上的 Runtime.exec 分叉可能会导致内存问题,即使是写入时复制和过度使用(这在 stackoverflow 中经常讨论,请参阅Java Runtime.getRuntime().exec () 替代品)。
在另一个 stackoverflow 帖子中,提出了使用 JNA 的解决方案,但是没有对此解决方案的评论,并且评价不高:如何解决“java.io.IOException:错误= 12,无法分配内存”调用 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");
}