如何分叉JVM?

Tar*_*pra 10 jvm

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

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

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

谢谢!

小智 16

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 by design,它是如何快照所有局部变量和状态的.这也是为什么没有适合非Unix环境的Unix shell的原因.


and*_*soj 8

一般来说,我不相信你的意思是这是可能的.您可以System.exec()分离新进程,并可以通过这种方式调用新的JVM.请注意,你当然可以fork()直接从本机代码中调用,但用这里的海报来说,"不要.只是不要."