2010-10-13 64 views
7

可能重复:
Java - C-Like Fork?如何分叉JVM?

我想知道它是如何可能从JDK fork一个孩子JVM甚至是有可能这样做?

像hadoop这样的框架为特定的任务派生了一个子JVM请参考这个主题。

谢谢!

+2

为什么downvote?这是一个合理的问题。 – 2010-10-18 22:57:35

回答

7

总的来说,我不认为这是可能的,你的意思是。你可以使用System.exec()来创建一个新进程,并且可以这样调用一个新的JVM。请注意,您当然可以直接从本机代码调用fork(),但用海报here的话来说,“不要,只是不要。”

+1

该链接有点过于Android特定的,不是吗? – ShiDoiSi 2012-10-09 07:54:00

+1

不要这么认为,至少对于链接的东西而言,不要复制到其他地方。fork的相同语义适用于其他地方...不要认为fork对JVM有意义,没有太多额外的行李。 – andersoj 2012-10-09 10:39:25

13

叉通常与产卵混淆。 Spawn是fork + exec(意思是启动一个进程 ,它将替换当前的进程并继承其外部资源的一部分,例如打开的套接字)。

Spawn在Java中可用(通过System.exec等)。

叉不在Java中,因为它会是非常有问题的。

叉需要克隆地址空间。 在大多数非Unix操作系统中,内核支持有效地执行此操作不可用 ;例如U/win和Cygwin在Win32下努力模仿 来仿效fork。 在诸如Java这样的语言中,垃圾收集器将会倾向于触摸Vmem页面,例如 ,这个空间在fork之后不会长时间保持共享。

克隆有许多副作用。例如,输入或输出缓冲器将在分叉儿童的所有 中处理。 SysV共享内存将被分离。

大多数语言和许多库只是拒绝 支持分叉。这包括(POSIX)线程API; 孩子不允许使用线程,直到它执行 (即变成一个产卵)!

Perl使用fork,因为它的内部非常接近C/Unix, ,并且它的多线程很糟糕。

Unix shell通过设计使用fork,这就是它如何快照 所有局部变量和状态。这也是为什么在非Unix环境下没有 像样的Unix shell。

+0

非常好的答案。 – 2015-09-20 17:18:37