18年轉眼就3月份都快結束了,也就是說一個季度就結束了;而我也由於年前筆記本壞了,今天剛修好了,那麼也應該繼續學習和博客之旅了。今年的博客之旅,從JVM開始學起,下面咱們就言歸正傳,進入正題。html
1、Java虛擬機與程序的生命週期java
一個運行時的Java虛擬機(JVM)負責運行一個Java程序。
當啓動一個Java程序時,一個虛擬機實例誕生;當程序關閉退出,這個虛擬機實例也就隨之消亡.
若是在同一臺計算機上同時運行多個Java程序,將獲得多個Java虛擬機實例,每一個Java程序都運行於它本身的Java虛擬機實例中。
在以下幾種狀況下,Java虛擬機將結束生命週期:
1.執行了System.exit()方法學習
2.程序正常執行結束spa
3.程序在執行過程當中遇到了異常或錯誤而異常終止操作系統
4.因爲操做系統出現錯誤而致使Java虛擬機進程終止code
2、類加載器ClassLoaderhtm
上面咱們提到了java 程序是基於JVM之上運行的,那麼咱們知道咱們編寫的java程序,首先java編譯器將咱們的源代碼編譯成爲字節碼,而後由JVM將字節碼load到內存中,接着咱們的程序就能夠建立對象了,咱們知道JVM將字節碼load到內存以後將將創建內存模型(JVM的內存模型咱們將在稍後闡述),那JVM是怎麼將類load到內存中的呢?對了,是經過Classloader;也就是咱們說的類加載器。在講解具體類加載執行流程前,咱們來看一段代碼:對象
class Singleton{ private static Singleton singleton=new Singleton(); private static int counter1; private static int counter2 = 0; public Singleton() { counter1++; counter2++; } public static int getCounter1() { return counter1; } public static int getCounter2() { return counter2; } public static Singleton getInstance(){ return singleton; } } public class ClassLoaderTest { @SuppressWarnings("static-access") public static void main(String[] args) { Singleton singleton=Singleton.getInstance(); System.out.println("counter1:"+singleton.getCounter1()); System.out.println("counter2:"+singleton.getCounter2()); } }
咱們先猜想一下運行結果,而後咱們再來調換一下單實例生成的順序,將:blog
private static Singleton singleton=new Singleton(); private static int counter1; private static int counter2 = 0;
修改成:生命週期
private static int counter1; private static int counter2 = 0; private static Singleton singleton=new Singleton();
而後咱們會驚奇的發現,居然結果是不同的,這又是爲何呢? 學過JVM的的類加載器過程的估計必定知道了,但沒有學過的,那麼不要急,讓咱們一塊兒來揭祕。
3、類的加載流程
緊接着上面的類型,讓咱們來看下類加載器究竟是如何來加載的,流程以下:
即類加載經歷了:加載 --> 鏈接 --> 初始化
1.加載:查找並加載類的二進制數據。
加載就是將二進制的字節碼經過IO輸入到JVM中,咱們的字節碼是存在於硬盤上面的,而所用的類都必須加載到內存中才能運行起來,加載就是經過IO把字節碼從硬盤遷移到內存中。
詳細分析見:《JVM學習二:JVM之類加載器之加載分析》:http://www.cnblogs.com/pony1223/p/8641015.html
2.鏈接:鏈接又分爲三個步驟:
驗證:確保被加載類的正確性。
即驗證class文件是否符合JVM的要求。
準備:爲類的靜態變量分配內存,並將其初始化爲默認值。
解析:把類中的符號引用轉換爲直接引用。
詳細分析見:《JVM學習三:JVM之類加載器之鏈接分析》:http://www.cnblogs.com/pony1223/p/8641083.html
3.初始化:
爲類的靜態變量賦予正確的初始值,即在程序裏爲靜態變量指定的初始值,或靜態代碼塊中的賦值操做。
靜態代碼塊是從上到下順序執行的,能夠對一個靜態變量屢次賦值,最後的結果爲靜態變量的初始值。
詳細分析見:《JVM學習四:JVM之類加載器之初始化分析》:http://www.cnblogs.com/pony1223/p/8641181.html
參考資料:
聖思園張龍老師深刻Java虛擬機系列