可能重复:
Java - C-Like Fork?
我想知道如何从JDK派生子JVM,甚至可以这样做?
像hadoop这样的一些框架为特定任务分配了一个子JVM,因此请对这个主题进行一些说明。
谢谢!
答案 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的话说,“不要。只是不要。”