我想知道是否有人确切地知道 ProcessBuilder/Runtime.exec() 是否在 JVM 内存空间内执行,或者它是否使用完全独立的系统内存并以某种方式将输出发送到 Java。我找不到有关该主题的任何文档。
由于安全问题和能够读取输出,我认为是前者,但我想绝对确定。
我想知道是否有人确切地知道 ProcessBuilder/Runtime.exec() 是否在 JVM 内存空间内执行,或者它是否使用完全独立的系统内存并以某种方式将输出发送到 Java。我找不到有关该主题的任何文档。
由于安全问题和能够读取输出,我认为是前者,但我想绝对确定。
新进程在启动它的 Java 进程之外运行。作为进程管理的一部分,分配给新进程的内存由操作系统管理。
Java 类ProcessBuilder
,它提供了一个用于启动和与新进程通信的接口,在 Java 进程内部运行。
似乎很清楚 exec 为那些不熟悉操作系统术语的人启动了一个新进程或程序。这就是为什么它具有输入输出功能、设置环境的能力以及等待外部程序返回的能力。
Executes the specified string command in a separate process.
The command argument is parsed into tokens and then executed as a command in a
separate process. The token parsing is done by a StringTokenizer created by the
call:
new StringTokenizer(command)
with no further modifications of the character categories. This method has exactly
the same effect as exec(command, null).
从Java SE的并发参考中说:
一个进程有一个独立的执行环境。一个进程通常有一套完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间。
如果您对内部结构感兴趣,请查看 openJDK 中的 UNIX Process 类。