如何fork JVM? [重复]

问题描述 投票:0回答:2

可能重复:
Java - 类似 C 的 Fork?

我想知道如何从 JDK 派生一个子 JVM,或者甚至可以这样做吗?

像 hadoop 这样的一些框架会为特定任务创建一个子 JVM,因此请对这个主题进行一些说明。

谢谢!

jvm fork
2个回答
18
投票

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。


8
投票

总的来说,我不认为这在你的意思上是可能的。 您可以

System.exec()
分离出一个新进程,并可以通过这种方式调用一个新的 JVM。 请注意,您当然可以直接从本机代码调用
fork()
,但用海报here 的话来说,“不要。就是不要。”

© www.soinside.com 2019 - 2024. All rights reserved.