好程序員Java培訓(xùn)分享JVM結(jié)構(gòu),jvm的基本結(jié)構(gòu),也就是我們俗稱概述。內(nèi)容很多,而且概念量也很大,關(guān)于概念方面,讓概念在你的腦子里變成圖形,所以只要你有耐心、仔細(xì),發(fā)揮自己的想象力,會(huì)讓你充滿信心。當(dāng)然,不是說(shuō)看完,就對(duì)jvm了解啦,jvm學(xué)習(xí)的知識(shí)非常的多。在你看完,后續(xù)我們還會(huì)來(lái)學(xué)jvm的細(xì)節(jié),但是如果你在看完的前提下去學(xué)習(xí),再學(xué)習(xí)其他jvm的細(xì)節(jié)會(huì)事半功倍。
1、什么是java虛擬機(jī)
首先我們先寫(xiě)一個(gè)類(lèi)
然后打開(kāi)cmd窗口輸入:java test.JVMForJava,打開(kāi)任務(wù)管理器-進(jìn)程,你看到一個(gè)叫java.exe的程序沒(méi)有,是的這就是java的虛擬機(jī),java xxx這個(gè)命令就是用來(lái)啟動(dòng)一個(gè)java虛擬機(jī),而main函數(shù)就是一個(gè)java應(yīng)用的入口,main函數(shù)被執(zhí)行時(shí),java虛擬機(jī)就啟動(dòng)了。好了ctrl+c結(jié)束你的jvm。在打開(kāi)你的ecplise,右鍵run application,再run application一次,再次打開(kāi)任務(wù)管理器-進(jìn)程,好了,我們看見(jiàn)會(huì)有兩個(gè)javaw.exe,為什么會(huì)有兩個(gè)?因?yàn)槲覀儎偛胚\(yùn)行了兩次run application。這里我是要告訴你,一個(gè)java的application對(duì)應(yīng)了一個(gè)java.exe/javaw.exe(java.exe和javaw.exe你可以把它看成java的虛擬機(jī),一個(gè)有窗口界面一個(gè)沒(méi)有)。你運(yùn)行幾個(gè)application就有幾個(gè)java.exe/javaw.exe?;蛘吒泳唧w的說(shuō),你運(yùn)行了幾個(gè)main函數(shù)就啟動(dòng)了幾個(gè)java應(yīng)用,同時(shí)也就啟動(dòng)了幾個(gè)java的虛擬機(jī)。
什么是java虛擬機(jī)和虛擬機(jī)實(shí)例?java的虛擬機(jī)相當(dāng)于我們的一個(gè)java類(lèi),而java虛擬機(jī)實(shí)例,相當(dāng)我們new一個(gè)java類(lèi),不過(guò)java虛擬機(jī)不是通過(guò)new這個(gè)關(guān)鍵字而是通過(guò)java.exe或者javaw.exe來(lái)啟動(dòng)一個(gè)虛擬機(jī)實(shí)例。
2、jvm的生命周期
話不多說(shuō)看代碼,然后ecplise里run application 之后在打開(kāi)任務(wù)管理器-進(jìn)程,你會(huì)看到一個(gè)javaw.exe的虛擬機(jī)在跑,查看控制臺(tái)輸出,并觀察任務(wù)管理器中的javaw.exe什么時(shí)候消失。
(結(jié)果我就不截圖了,太長(zhǎng)了。)
如果你觀察控制臺(tái)和任務(wù)管理器的javaw.exe會(huì)發(fā)現(xiàn),當(dāng)main函數(shù)的for循環(huán)打印完的時(shí)候,程序它跟我想的不一樣居然沒(méi)有退出,而等到整個(gè)new Thread()里的匿名類(lèi)的run方法執(zhí)行結(jié)束后,javaw.exe才退出。我們知道在c++的win32編程(CreatThread()),main函數(shù)執(zhí)行完了,寄宿線程也跟著退出了,在c#中如果你用線程池(ThreadPool)的話,結(jié)論也是如此,線程都跟著宿主進(jìn)程的結(jié)束而結(jié)束。但是在java中貌似和我們的認(rèn)知有很大的出入,這是怎么回事,先不要看結(jié)果自己想想為什么。
沒(méi)錯(cuò)這就是由于java的虛擬機(jī)中它有兩種線程,一種叫叫守護(hù)線程,一種叫非守護(hù)線程,main函數(shù)就是個(gè)非守護(hù)線程,虛擬機(jī)的gc就是一個(gè)守護(hù)線程。java的虛擬機(jī)中只要有任何非守護(hù)線程還沒(méi)有結(jié)束,java虛擬機(jī)的實(shí)例都不會(huì)退出,所以即使main函數(shù)這個(gè)非守護(hù)線程退出,但是由于在main函數(shù)中啟動(dòng)的匿名線程也是非守護(hù)線程,它還沒(méi)有結(jié)束,所以jvm沒(méi)辦法退出。
java虛擬機(jī)的生命周期,當(dāng)一個(gè)java應(yīng)用main函數(shù)啟動(dòng)時(shí)虛擬機(jī)也同時(shí)被啟動(dòng),而只有當(dāng)在虛擬機(jī)實(shí)例中的所有非守護(hù)進(jìn)程都結(jié)束時(shí),java虛擬機(jī)實(shí)例才結(jié)束生命。