2010-10-13 63 views
7

可能重複:
Java - C-Like Fork?如何分叉JVM?

我想知道它是如何可能從JDK fork一個孩子JVM甚至是有可能這樣做?

像hadoop這樣的框架爲特定的任務派生了一個子JVM請參考這個主題。

謝謝!

+2

爲什麼downvote?這是一個合理的問題。 – 2010-10-18 22:57:35

回答

7

總的來說,我不認爲這是可能的,你的意思是。你可以使用System.exec()來創建一個新進程,並且可以這樣調用一個新的JVM。請注意,您當然可以直接從本機代碼調用fork(),但用海報here的話來說,「不要,只是不要。」

+1

該鏈接有點過於Android特定的,不是嗎? – ShiDoiSi 2012-10-09 07:54:00

+1

不要這麼認爲,至少對於鏈接的東西而言,不要複製到其他地方。fork的相同語義適用於其他地方...不要認爲fork對JVM有意義,沒有太多額外的行李。 – andersoj 2012-10-09 10:39:25

13

叉通常與產卵混淆。 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。

+0

非常好的答案。 – 2015-09-20 17:18:37