我想知道它是如何可能從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