更新時間:2019-08-09 10:39:58 來源:動力節點 瀏覽3023次
好程序員Java培訓分享JVM結構,jvm的基本結構,也就是我們俗稱概述。內容很多,而且概念量也很大,關于概念方面,讓概念在你的腦子里變成圖形,所以只要你有耐心、仔細,發揮自己的想象力,會讓你充滿信心。當然,不是說看完,就對jvm了解啦,jvm學習的知識非常的多。在你看完,后續我們還會來學jvm的細節,但是如果你在看完的前提下去學習,再學習其他jvm的細節會事半功倍。
1、什么是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?;蛘吒泳唧w的說,你運行了幾個main函數就啟動了幾個java應用,同時也就啟動了幾個java的虛擬機。
什么是java虛擬機和虛擬機實例?java的虛擬機相當于我們的一個java類,而java虛擬機實例,相當我們new一個java類,不過java虛擬機不是通過new這個關鍵字而是通過java.exe或者javaw.exe來啟動一個虛擬機實例。
2、jvm的生命周期
話不多說看代碼,然后ecplise里run application
之后在打開任務管理器-進程,你會看到一個javaw.exe的虛擬機在跑,查看控制臺輸出,并觀察任務管理器中的javaw.exe什么時候消失。
(結果我就不截圖了,太長了。)
如果你觀察控制臺和任務管理器的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虛擬機實例才結束生命。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習