可能重复:
Java - 类似 C 的 Fork?
我想知道如何从 JDK 派生一个子 JVM,或者甚至可以这样做吗?
像 hadoop 这样的一些框架会为特定任务创建一个子 JVM,因此请对这个主题进行一些说明。
谢谢!
Fork 通常与 Spawn 混淆。 Spawn是fork + exec(意思是启动一个进程 它取代了当前的并继承了一些 它的外部资源,例如打开的套接字)。
Spawn 在 Java 中可用(通过 System.exec 等)。
Java 中没有 Fork,因为它会带来极大的问题。
Fork 需要克隆地址空间。 无法有效执行此操作的内核支持 在大多数非 Unix 操作系统中; 例如U/win 和 Cygwin 一直在挣扎 在 Win32 下模拟 fork。 在 Java 等语言中,垃圾收集器 & JIT 编译器倾向于接触 Vmem 页面,例如 分叉后该空间不会长期保持共享状态。
克隆有很多副作用。 例如,输入或输出缓冲区将在所有 分叉的孩子们。 SysV 共享内存将被分离。
大多数语言和许多库只是拒绝 支持分叉。 这包括 (POSIX) 线程 API; 子进程在执行之前不允许使用线程 (即,成为产卵)!
Perl 使用 fork 因为它的内部结构与 C/Unix 极其接近, 而且它的多线程非常糟糕。
Unix shell 设计上使用 fork,这就是它快照的方式 所有局部变量和状态。 这也是为什么没有 适用于非 Unix 环境的不错的 Unix shell。
总的来说,我不认为这在你的意思上是可能的。 您可以
System.exec()
分离出一个新进程,并可以通过这种方式调用一个新的 JVM。 请注意,您当然可以直接从本机代码调用 fork()
,但用海报here 的话来说,“不要。就是不要。”