我正在尝试寻找不使用 fork 的 Java Runtime.exec() 的替代方法。问题是我们的 JVM 消耗了大部分内存,并且该进程上的 Runtime.exec 分支可能会导致内存问题,即使是写时复制和 overcomit(这在 stackoverflow 中经常讨论,请参阅 Java Runtime.getRuntime().exec() alternatives)。
在另一篇 stackoverflow 帖子中,提出了一个使用 JNA 的解决方案,但该解决方案没有评论,评价也不高: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 进行系统调用是否可以防止 fork ,是否可以避免 fork 可能导致的后续内存分配问题?这是我正在使用的代码:
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");
}
最佳答案
可能不会。您正在调用的 system()
的实现几乎肯定是使用 fork()
本身——C 实现将类似于:
int system(const char *cmd) {
if (fork() == 0) {
execl("/bin/sh", "-c", cmd);
_exit(1);
}
int result;
wait(&result);
return WEXITSTATUS(result);
}
一个更可行的解决方案是维护一个小型外部进程的通信线路(例如,管道),该进程可以为您生成子进程。 Android 做的事情非常像这样;外部过程称为“合子”。
关于java - JNA system() 是否避免 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10729632/