可能重复:
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的原因.