gpt4 book ai didi

java - JNA system() 是否避免 fork

转载 作者:行者123 更新时间:2023-12-04 21:28:51 24 4
gpt4 key购买 nike

我正在尝试寻找不使用 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/

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