如何分叉JVM?

时间:2010-10-13 06:39:42

标签: jvm

  

可能重复:
  Java - C-Like Fork?

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

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

谢谢!

2 个答案:

答案 0 :(得分:14)

Fork通常与spawn混淆。 Spawn是fork + exec(这意味着启动一个进程 它取代了当前的并继承了一些 它的外部资源,如开放套接字)。

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

Fork不在Java中,因为它会出现问题。

Fork需要克隆地址空间。 无法有效地执行此操作的内核支持 在大多数非Unix操作系统中;例如U / win和Cygwin一直在努力 在Win32下模拟fork。 在诸如Java之类的语言中,垃圾收集器 &安培; JIT编译器倾向于触及Vmem页面 在fork之后,空间不会长时间保持共享。

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

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

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

Unix shell使用fork设计,它是快照的方式 所有局部变量和状态。这也是为什么没有 适用于非Unix环境的不错的Unix shell。

答案 1 :(得分:7)

总的来说,我不相信你的意思是这是可能的。您可以System.exec()剥离新进程,并可以通过这种方式调用新的JVM。请注意,您当然可以直接从本机代码拨打fork(),但用海报here的话说,“不要。只是不要。”