2010-11-02 146 views
3

(請糾正我,如果我錯了)什麼啓動JVM線程?

我明白,當你通過發出java命令運行Java程序,

java MyProg 

程序將運行到一個新的JVM。

  • 什麼將程序加載到新的JVM中? JRE是否會產生新的線程?

  • 如果每個程序都運行在它自己的JVM中,它們可以相互通信嗎?

  • 我之前就如何使用JMX向本地運行的java程序發送請求問了一個問題。我發現如果JMX命令在本地發佈,我不需要端口號。答案是,客戶端應用程序(例如jconsole,jvisualvm,jprobe等)搜索機器上運行的Java應用程序。這很好,但是考慮到客戶端應用程序將運行在與想要監視或交談的應用程序不同的JVM中,它們究竟如何彼此連接而沒有端口號(因爲它們不在同一個JVM上運行)?

  • 如果兩個程序正在運行,通常會有2個JVM。 JVM是否在相同的JRE流程中運行?這也意味着這兩個JVM應該能夠溝通?

感謝

回答

6
  • 程序(更具體地編譯的類)由一個組件在JVM稱爲系統類加載器加載。 (瞭解更多關於班級裝載機的信息here)。 JVM使用本地代碼庫(由引導類加載器加載)生成一個新線程。
  • 它們可以使用套接字,RPC和其他IPC機制進行通信(通常使用本機庫進行訪問)。
  • 不知道確切的答案,但必須有一個標準的端口。
  • JVM的不同實例是獨立的進程。它們在內存中不分享任何內容。 (儘管如果在同一個系統上運行,它們可能會共享相同JRE安裝的庫和配置文件,這與在同一系統上運行Firefox,Emacs或其他應用程序的兩個實例沒有區別。
+0

......必須有一個標準的端口或任何其他操作特定的IPC機制(例如Unix上的命名管道或shmem)。 – ShiDoiSi 2010-11-02 13:36:33

2

有幾種方法用於方案不同的JVM進行通信:

  1. 的ObjectInputStream,ObjectOutputStream的

  2. RMI

  3. 插座

2

幕後沒有特別的魔法。 java是一個實現JVM的程序。如果你同時運行java和兩個不同的程序(例如在兩個不同的shell中),你會得到兩個運行它們自己的JVM的進程。他們可以通過任何IPC或網絡協議進行通信。