Java JNA system()是否避免使用fork
我试图找到一种不使用fork的Java Runtime.exec()替代方法。问题是JVM消耗了大部分内存,并且该进程上的Runtime.exec fork可能会导致内存问题,即使是写时拷贝和overwit(这在stackoverflow中经常讨论,请参阅) 在另一篇stackoverflow文章中,有人建议使用JNA解决方案,但对此解决方案没有任何评论,也没有得到高度评价: 同样,这里也提出了类似的JNA解决方案: 我的问题是:使用JNA进行系统调用是否会阻止fork,以及它是否会避免fork可能导致的后续内存分配问题?以下是我正在使用的代码:Java JNA system()是否避免使用fork,java,runtime,exec,jna,Java,Runtime,Exec,Jna,我试图找到一种不使用fork的Java Runtime.exec()替代方法。问题是JVM消耗了大部分内存,并且该进程上的Runtime.exec fork可能会导致内存问题,即使是写时拷贝和overwit(这在stackoverflow中经常讨论,请参阅) 在另一篇stackoverflow文章中,有人建议使用JNA解决方案,但对此解决方案没有任何评论,也没有得到高度评价: 同样,这里也提出了类似的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");
}
不,需要做一个(或等效的),而JNA对此无能为力
我不认为人们建议您使用JNA调用系统
,而是执行实际的系统调用。例如,该博客给出了chmod
和chown
作为示例。因此,使用您的示例,而不是使用JNA调用system('ls')
,而是调用opendir
和readdir
(当然,这同样适用于您真正调用的任何东西)
您可能需要创建一个DLL来包装所需的功能。如果没有fork(),就不可能执行“系统”。可能没有。您正在调用的
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做的事情非常像这样;外部过程被称为“受精卵”。那么system()是如何工作的呢?如果它仍然使用叉子?
我遇到了一个错误“java.io.IOException:error=12,无法分配内存”
这为我解决了这个问题:
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);
}
感谢您关于使用小型外部流程的建议。我正在使用ucspi tcp中的tcpserver来侦听来自Java的套接字连接。tcpserver为我生成了shell进程。工作起来很有魅力,可以让我的记忆更具可预测性。如果您使用TCP,请确保它只能在本地访问,并且不会暴露于权限级别较低的进程。