2010-09-06 70 views
8

通過兩個不同的命令行調用java是否涉及兩個不同的JVM或兩個相同JVM的獨立實例。JVM的實例

+3

你知不知道這兩個答覆都是等價的? – Riduidel 2010-09-06 14:53:52

+0

你應該更具體。 JVM對你有什麼不同,是什麼?你要求什麼區別? – splash 2010-09-06 15:01:02

回答

21

JVM是Java虛擬機,它是加載類(代碼)和共享對象(數據)的內存空間。 JVM相當於一個操作系統進程。

當您在命令行中輸入java...時,您正在執行一個獨立的進程,用於加載內存中的Java類,來自Java和您的基類(來自.class文件或指示的.jar)。

另一個java...命令將使用自己的內存加載一個不同的進程,並自行加載類。

實例詞混淆:當你說'兩個相同的JVM實例'。通常將一個JVM的實例表示爲一個單獨的進程,即一個加載的獨立JVM。如果您說:兩個進程正在運行JVM 1.5,那麼它們是相同的JVM,但它們是不同的進程,不同的「實例」,在所有意義上都是獨立的。

Web應用程序混淆: Web應用程序(例如)只是一堆實例化的類和對象,在Web服務器中出現一些URL。您可以使用10個不同的應用程序啓動Tomcat - 即10個不同的類和對象,每個類都有不同的請求,但實際上它們共享相同的內存空間(OS進程)。一個webapp不能觸及其他webapp的對象,因爲沒有人給它提供對其他對象的引用(並且類以某種方式被隱藏,但是這是另一個叫做class-loading的故事)。

1

你的問題有什麼不同?我會說:兩個不同的JVM實例。 :)

java命令的每次運行確​​實會調用新的JVM實例。正在運行的Java應用程序可以運行新的Java線程(就像Tomcat用Web應用程序做的那樣)。

+0

你是說兩者都是不同的JVM? – JavaUser 2010-09-06 14:54:45

+0

是的,在不同的過程意義上。 – splash 2010-09-06 14:56:09

+0

我怎麼能感覺到這個..你有任何代碼或概念來實現這一點? – JavaUser 2010-09-06 15:00:41

1

兩個獨立的JVM。你可以在同一個JVM中運行大量的東西(比如說由同一個Tomcat實例提供的10個webapps),但是隻有一個java命令來啓動tomcat。

+0

那麼你爲什麼說兩個不同的JVM? – JavaUser 2010-09-06 14:56:18

+0

因爲2個java命令將導致2個JVM實例。相反,如果您只啓動一次tomcat並部署10次戰爭......只有1個JVM正在運行 – bwawok 2010-09-06 17:13:31

1

如果您從它們的JDK/JRE 1.6版本的JDK/JRE版本1.6開始,使用相同的源路徑兩次啓動Sun的java.exe,那麼您將獲得兩個獨立且不同的JVM實例。除非通過應用程序對其進行配置,否則它們之間不會共享。如果你想要兩個不同的JVM運行,你必須從一個位置啓動一個類型的java.exe(比如1.5),並從另一個位置啓動一個java.exe(1.6版本)。

相關問題