JVM知識整理

基於《深刻理解java虛擬機》類加載過程整理java

  • 1  加載class類
  •          ①根據類的全限定名獲取二進制字節流
  •          ② 將字節流表明的靜態存儲結構轉化爲方法區(元空間)運行時時數據結構
  •           ③在內存中生成一個class對象
  • 2 驗證
  •           1)元數據驗證
               ①驗證是否實現父類或者接口的方法
               ②驗證該類是否有該屬性和該方法
               ③有沒有final修飾的類被繼承了
              
           2) 符號引用驗證
                1 根據全限定名是否能夠找該類(在項目打包或者打補丁的時候有可能會漏掉某個類)
                2 符號引用中的類的字段、方法在能夠被當前類訪問
                (有可能字段、方法以前是能夠訪問,後來被private,而後其餘引用類沒有改回來)
  • 3 準備
  •           爲類變量(靜態變量,靜態變量之間的初始化順序是從上往下)分配內存空間,併爲八基本類型的類變量賦默認值,引用類型變量的默認值是null,若是是被final修飾的變量則直接複製,常量也會在這個階段初始化並賦值
  • 4 解析
  •          將符號引用解析是直接引用,在方法調用是目標方法在class文件中都是給常量池的符號引用,在解析過程就把這個符號引用解析成直接引用
  •         符號引用和直接引用
  •               符號引用:用一組符號來描述引用的目標
  •               直接引用:直接指向目標的指針、相對偏移量、間接定位目標的句柄
  • 5 初始化
  •         對象實例化

注意:加載一個類時,其內部類不會同時被加載。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生。 數據結構

動態加載?spa

     類加載器線程

       1 啓動類加載器(Bootstrap ClassLoader):有C++語言實現,負責加載AVA_HOME/lib文件夾的類,或者被Xbootclasspath參數指定的路徑中的類指針

       2 擴展類加載器(Extension ClassLoader),java語言實現,負責加載JAVA_HOME/lib/ext文件夾下的類對象

       3 應用程序加載器(Application ClassLoader):sun.misc.Launcher$AppClassLoader,負責加載classpath路徑的類繼承

    雙親委派模型接口

       雙親委派模型是每一個類加載器(除了頂級加載器--啓動類加載器)收到類的加載請求,首先不是本身去查找加載該類,而是委派給父類,每一層的類加載器都是如此,知道頂級類加載器,只有當頂級類加載器反饋本身也找不到該類,子類才嘗試本身加載該類內存

內存模型同步

     分主內存和線程的工做內存

           1 線程先從內存複製一份變量的副本,而後變量的寫操做在線程的工做內存中完成,當線程執行完畢則將內存中變量副本的值更新下到主內存中

           注意:線程與線程是互相獨立,線程不能直接訪問其餘線程工做內存的變量

          volatile是保證內存的可見性在於兩點

               ①線程每次使用該變量前都是去主內存刷新一次

              ② 線程每次修改變量,都會當即同步到主內存

相關文章
相關標籤/搜索