一台机器上有几个java虚拟机
一臺機器上java虛擬機會存在多少個?
一直以來,我都認為,每臺電腦上java虛擬機只存在一個;如果你啟動多個java程序,這些程序都在一個虛擬機中運行。這是常規(guī)的想法,就像我們自己的電腦,電腦只有一臺,可以跑很多個程序。
如果說有多個java虛擬機,顯然說法有問題。
諸如此類的疑問;
在一臺機器上啟動兩個tomcat,會有幾個java虛擬機?
再如在elcipse中run一個main方法,會單獨開一個java虛擬機嗎?
執(zhí)行一個class文件,會單獨開一個java虛擬機嗎?
下面來看一下實際情況;
Java 程序本質(zhì)上是 class 文件描述的字節(jié)碼,字節(jié)碼的是在 JVM 中 執(zhí)行 的。
每個 Java 進程都是一個 JVM 實例。
一旦程序結(jié)束,JVM 實例也就銷毀了。
所以以java命令啟動的,都會新增一個jvm進程;
所以:
1.啟動2個tomcat,內(nèi)部是java啟動,會有2個jvm進程;
2.eclipse中的run,內(nèi)部是java啟動,會單獨開一個jvm進程;
3.執(zhí)行class文件,如果是java去執(zhí)行就會開,如果僅僅使用現(xiàn)有jvm進程來load就不會增加;
實際情況是:運行多個java程序,沒有多個java虛擬機,有多個java虛擬機的實例;
有如下一段英文描述;
jvm實例的個數(shù)
Generally speaking, each application will get its own JVM instance and its own OS-level process and each JVM instance is independent of each other.
There are some implementation details such as Class Data Sharing, where multiple JVM instances might share some data/memory but those have no user-visible effect to the applications (except for improved startup time, hopefully).
A common scenario however is a single application server (or "web server") such as Glassfish or Tomcat running multiple web applications. In this case, multiple web applications can share a JVM.
? ? 第一句話說:一般而言,每個應(yīng)用程序?qū)⒂兴约旱腏VM實例......
一個java的應(yīng)用程序?qū)?yīng)于一個JVM實例,當一個java程序運行的時候,一個jvm實例就誕生了;
下面來做小程序驗證一下;
做3個小程序,代碼如下;
同時運行3個java程序;?
看一下任務(wù)管理器;有3個java.exe;并不是 test1,test2, test3 3個程序;看這3個java.exe的描述,是一樣的,Java(TM) Platform SE binary;?
結(jié)束test2程序;java.exe少了一個;?
如果都結(jié)束,3個java.exe都消失;
也就是;
每一個java程序?qū)?yīng)一個jvm實例,都有自己的程序執(zhí)行空間,每一個都有一套jvm虛擬機機制。
一個java程序?qū)?yīng)一個jvm實例,一個jvm對應(yīng)一個堆;
堆內(nèi)存用來存放運行時創(chuàng)建的對象。一般來講,通過 new 關(guān)鍵字創(chuàng)建出來的對象都存放在堆內(nèi)存中。由于 JVM 是基于堆棧的虛擬機,而每個 Java 程序都運行在一個單獨的 JVM 實例上,每一個實例唯一對應(yīng)一個堆,一個 Java 程序內(nèi)的多個線程也就運行在同一個 JVM 實例上,因此這些線程之間會共享堆內(nèi)存,鑒于此,多線程在訪問堆中的數(shù)據(jù)時需要對數(shù)據(jù)進行同步。
?
java虛擬機有多種實現(xiàn)版本;java -version命令中可以看到j(luò)ava虛擬機的名稱;
? ? Java HotSpot<TM> 64-Bit Server VM,這個是java虛擬機的名字;
總結(jié)
以上是生活随笔為你收集整理的一台机器上有几个java虚拟机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机常量池和本地变量表、自己定
- 下一篇: java自定义类加载器