好程序員Java分享JVM結構,jvm的基本結構,也就是咱們俗稱概述。內容不少,並且概念量也很大,關於概念方面,讓概念在你的腦子裏變成圖形,因此只要你有耐心、仔細,發揮本身的想象力,會讓你充滿信心。固然,不是說看完,就對jvm瞭解啦,jvm學習的知識很是的多。在你看完,後續咱們還會來學jvm的細節,可是若是你在看完的前提下去學習,再學習其餘jvm的細節會事半功倍。
一、什麼是java虛擬機
首先咱們先寫一個類java
而後打開cmd窗口輸入:java test.JVMForJava,打開任務管理器-進程,你看到一個叫java.exe的程序沒有,是的這就是java的虛擬機,java xxx這個命令就是用來啓動一個java虛擬機,而main函數就是一個java應用的入口,main函數被執行時,java虛擬機就啓動了。好了ctrl+c結束你的jvm。在打開你的ecplise,右鍵run application,再run application一次,再次打開任務管理器-進程,好了,咱們看見會有兩個javaw.exe,爲何會有兩個?由於咱們剛纔運行了兩次run application。這裏我是要告訴你,一個java的application對應了一個java.exe/javaw.exe(java.exe和javaw.exe你能夠把它當作java的虛擬機,一個有窗口界面一個沒有)。你運行幾個application就有幾個java.exe/javaw.exe。或者更加具體的說,你運行了幾個main函數就啓動了幾個java應用,同時也就啓動了幾個java的虛擬機。
什麼是java虛擬機和虛擬機實例?java的虛擬機至關於咱們的一個java類,而java虛擬機實例,至關咱們new一個java類,不過java虛擬機不是經過new這個關鍵字而是經過java.exe或者javaw.exe來啓動一個虛擬機實例。
二、jvm的生命週期
(1)話很少說看代碼,而後ecplise裏run application 以後在打開任務管理器-進程,你會看到一個javaw.exe的虛擬機在跑,查看控制檯輸出,並觀察任務管理器中的javaw.exe何時消失。c++
(結果我就不截圖了,太長了。)
若是你觀察控制檯和任務管理器的javaw.exe會發現,當main函數的for循環打印完的時候,程序它跟我想的不同竟然沒有退出,而等到整個new Thread()裏的匿名類的run方法執行結束後,javaw.exe才退出。咱們知道在c++的win32編程(CreatThread()),main函數執行完了,寄宿線程也跟着退出了,在c#中若是你用線程池(ThreadPool)的話,結論也是如此,線程都跟着宿主進程的結束而結束。可是在java中貌似和咱們的認知有很大的出入,這是怎麼回事,先不要看結果本身想一想爲何。
沒錯這就是因爲java的虛擬機中它有兩種線程,一種叫叫守護線程,一種叫非守護線程,main函數就是個非守護線程,虛擬機的gc就是一個守護線程。java的虛擬機中只要有任何非守護線程尚未結束,java虛擬機的實例都不會退出,因此即便main函數這個非守護線程退出,可是因爲在main函數中啓動的匿名線程也是非守護線程,它尚未結束,因此jvm沒辦法退出。
java虛擬機的生命週期,當一個java應用main函數啓動時虛擬機也同時被啓動,而只有當在虛擬機實例中的全部非守護進程都結束時,java虛擬機實例才結束生命。程序員