如何分叉JVM?

如何分叉JVM?,jvm,Jvm,可能重复: 我想知道如何从JDK中派生出一个子JVM,或者甚至可以这样做 一些框架,比如hadoop,会为特定的任务提供一个子JVM,因此,请对这个主题进行一些说明 谢谢 总的来说,我认为这在你的意思上是不可能的。您可以System.exec()派生一个新进程,并可以通过这种方式调用一个新的JVM。请注意,您当然可以直接从本机代码调用fork(),但用海报上的话来说,“不要。就是不要。”fork通常与spawn混淆。 Spawn是fork+exec(意思是启动一个进程) 它将替换当前的并继承其

可能重复:

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

一些框架,比如hadoop,会为特定的任务提供一个子JVM,因此,请对这个主题进行一些说明


谢谢

总的来说,我认为这在你的意思上是不可能的。您可以
System.exec()
派生一个新进程,并可以通过这种方式调用一个新的JVM。请注意,您当然可以直接从本机代码调用
fork()
,但用海报上的话来说,“不要。就是不要。”

fork通常与spawn混淆。 Spawn是fork+exec(意思是启动一个进程) 它将替换当前的并继承其中的一些 它的外部资源(如开放套接字)

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

Fork不在Java中,因为它会带来极大的问题

Fork需要克隆地址空间。 有效执行此操作的内核支持不可用 在大多数非Unix操作系统中;e、 g.U/win和Cygwin一直在挣扎 在Win32下模拟fork。 在Java等语言中,垃圾收集器 &JIT编译器倾向于接触Vmem页面,例如 在fork之后,这个空间不会长久地被共享

克隆有许多副作用。 例如,输入或输出缓冲区将在所有 有叉子的孩子。SysV共享内存将被分离

大多数语言和许多库都拒绝这样做 支持分叉。这包括(POSIX)线程API; 在执行之前,不允许子级使用线程 (即,成为一个卵)

Perl使用fork是因为其内部非常接近C/Unix, 而且它的多线程处理非常糟糕

unixshell在设计上使用fork,这就是它的工作原理 所有局部变量和状态。这也是为什么没有
适合非Unix环境的Unix shell。

为什么要否决?这是一个合理的问题。这个链接有点过于特定于Android,不是吗?不要这样认为,至少对于一些链接和未复制的内容。fork的相同语义也适用于其他地方。。。不要认为fork对于JVM来说是有意义的,因为它没有太多额外的负担。