2009-09-17 90 views
8

我正在執行主應用程序中的另一個JVM(java.exe)。有什麼辦法可以與新創建的進程(在創建時或創建之後)共享一個對象(相當大的對象)。跨Java進程共享對象

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("java -cp " + tempDir + jarsInPath + " " + appMain); 

現在我想所謂對象可通過進程內對象

確實的ProcessBuilder表示的進程爲此提供任何事業嗎?

回答

0

不,在Java中沒有共享內存支持。

解決此問題的最簡單方法是將對象序列化爲臨時文件,然後將其反序列化回新JVM中。

+0

我正在使用編譯器(Java的擴展)。我必須預處理輸出不同AST的AST。爲了處理這些,我必須再次調用編譯器。我不想單獨執行它們,我想簡化這個過程。目前,我只是在新過程中重新解析原始的Java程序。我試着序列化,但是它有一個很大的對象(一個完整的程序,要精確),有很多數據結構。 – user174819 2009-09-17 08:42:32

1

您可以公開服務以允許訪問來自對象的數據。使用RMI建立進程間通信相對簡單。這會導致IPC的開銷,所以這不會像本地訪問一樣具有表現性,細粒度的訪問會變得昂貴,但是如果你得到摘要或其他彙總數據,那麼這可能是一個體面的模型。

你不說爲什麼這些是獨立的過程。你有沒有機會直接將你的子進程的代碼加載到父進程中?動態加載和卸載是可能的。

+0

我該如何'將你孩子的代碼直接加入父母'。另外我不想從子進程獲取數據只從父進程發送數據到子進程? – user174819 2009-09-17 08:44:06

+0

父 - >孩子,孩子 - >父母,沒有區別,一個提供服務,另一個調用它。但我的主要問題是爲什麼他們是獨立的進程?只需要一個大的流程,線程完成不同的工作。根據您的需要,您可以鏈接一個大型程序,或使用標準Java API動態加載類 – djna 2009-09-17 13:16:03

+0

可能會認爲這是JVM體系結構模型的限制。提供缺乏這種設施的服務層變得相當困難。即使按摩傳遞操作系統也會使用共享對象和服務。 – will 2013-05-29 13:05:34

3

如果您想共享對象,最好的方法是使用線程而不是單獨的進程。進程不能共享內存(除了通過JNI),所以你必須通過文件或通過RMI套接字連接以序列化形式來回複製大對象(後者是更好的選擇,因爲它會導致固有的同步) 。

+0

可以使用線程來啓動另一個JVM(java.exe),就像上面顯示的代碼一樣嗎?我一直看到Process被用來啓動另一個JVM。 – user174819 2009-09-17 08:46:23

+0

不,你不能啓動另一個JVM - 那麼它將是一個進程,而不是一個線程。但是你真的需要另一個JVM嗎?難道你不能只是執行main()方法而不是在線程中啓動新的JVM? – 2009-09-17 08:58:41

0

我認爲你可以使用分佈式緩存爲此目的(EHCache,memcached等...)