如何分叉JVM?
可能重复:如何分叉JVM?,jvm,Jvm,可能重复: 我想知道如何从JDK中派生出一个子JVM,或者甚至可以这样做 一些框架,比如hadoop,会为特定的任务提供一个子JVM,因此,请对这个主题进行一些说明 谢谢 总的来说,我认为这在你的意思上是不可能的。您可以System.exec()派生一个新进程,并可以通过这种方式调用一个新的JVM。请注意,您当然可以直接从本机代码调用fork(),但用海报上的话来说,“不要。就是不要。”fork通常与spawn混淆。 Spawn是fork+exec(意思是启动一个进程) 它将替换当前的并继承其
我想知道如何从JDK中派生出一个子JVM,或者甚至可以这样做 一些框架,比如hadoop,会为特定的任务提供一个子JVM,因此,请对这个主题进行一些说明
谢谢 总的来说,我认为这在你的意思上是不可能的。您可以
System.exec()
派生一个新进程,并可以通过这种方式调用一个新的JVM。请注意,您当然可以直接从本机代码调用fork()
,但用海报上的话来说,“不要。就是不要。”fork通常与spawn混淆。
Spawn是fork+exec(意思是启动一个进程)
它将替换当前的并继承其中的一些
它的外部资源(如开放套接字)
Spawn在Java中可用(通过System.exec等)
Fork不在Java中,因为它会带来极大的问题
Fork需要克隆地址空间。
有效执行此操作的内核支持不可用
在大多数非Unix操作系统中;e、 g.U/win和Cygwin一直在挣扎
在Win32下模拟fork。
在Java等语言中,垃圾收集器
&JIT编译器倾向于接触Vmem页面,例如
在fork之后,这个空间不会长久地被共享
克隆有许多副作用。
例如,输入或输出缓冲区将在所有
有叉子的孩子。SysV共享内存将被分离
大多数语言和许多库都拒绝这样做
支持分叉。这包括(POSIX)线程API;
在执行之前,不允许子级使用线程
(即,成为一个卵)
Perl使用fork是因为其内部非常接近C/Unix,
而且它的多线程处理非常糟糕
unixshell在设计上使用fork,这就是它的工作原理
所有局部变量和状态。这也是为什么没有
适合非Unix环境的Unix shell。为什么要否决?这是一个合理的问题。这个链接有点过于特定于Android,不是吗?不要这样认为,至少对于一些链接和未复制的内容。fork的相同语义也适用于其他地方。。。不要认为fork对于JVM来说是有意义的,因为它没有太多额外的负担。