我想知道它是如何可能从JDK fork一个孩子JVM甚至是有可能这样做?
像hadoop这样的框架为特定的任务派生了一个子JVM请参考这个主题。
谢谢!
我想知道它是如何可能从JDK fork一个孩子JVM甚至是有可能这样做?
像hadoop这样的框架为特定的任务派生了一个子JVM请参考这个主题。
谢谢!
叉通常与产卵混淆。 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。
非常好的答案。 – 2015-09-20 17:18:37
为什么downvote?这是一个合理的问题。 – 2010-10-18 22:57:35