java - JNA system() 是否避免 fork

标签 java runtime exec jna

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

相关文章:

Java EE : Where could I read about dao, 服务以及为什么使用它们?

java - 在 Java 中,如何获取给定字符串的属性及其名称?

php - 通过 exec() 从 php 调用 php 没有结果

java - 如何设置 log4j 属性文件?

java - 在java测试中强制执行assertj

Objective-C 运行时和内存管理

java - 运行时执行不显示结果

c# - 在运行时加载引用调用程序集的程序集

android - 编写执行 linux 命令的 android 应用程序

linux - 如何等待进程子进程?