java虛擬機
1.Java虛擬機是一種物理機,是一種調用方法和執行方法的數據結構。
2.jdk,jre,jvm它們三者之間的關係:jdk>jre>jvm。
jdk是所有的組件的環境,裏面包含的各種工具,組件。
jre是Java使用的各種技術,比如:Java web start,Applet/java Plug-in,javaFx ,Swing,,,,等等。
jvm是jdk環境裏面的一種虛擬機,很小的範圍,用來運行客戶端和服務端的作用。
3.代碼是怎麼運行的?
Java源文件把代碼寫好,然後進行編譯,當在終端輸入java 文件名.java;時源文件.java.變成了.class,也就是字節碼文件,然後字節碼文件再進行編譯,通過類加載機制進行編譯到內存中,也就是要通過虛擬機進行的。
4.類加載機制?
類加載機制就是虛擬機把.class文件加載到內存,並對數據進行校驗,轉換解析和初始化,形成虛擬機直接使用的Java類型,即java.lang.class.
5.裝載:
1).通過一個全限類名獲取此類的二進制流,
2).通過這個二進制流所代表的靜態存儲結構轉換成爲方法區的運行時數據結構,
3).在java 堆中生成一個代表這個類的java.lang.Class對象,作爲方法區中這些數據的訪問入口。
6.連接(LINK)。
裏面有驗證,解析,初始化。
1).驗證:驗證一些文件規範,文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證。
2).準備:類的靜態變量分配內存,並將其初始化。
3).解析:把類中的符號引用轉換成直接引用。
7.初始化:
對類的靜態變量,靜態代碼塊執行初始化操作。
加載時的原則:
雙親委派機制:一個類加載器接到類加載請求時,它首先不會自己去加載這個類,而是把這個請求任務委託給父類加載器中完成,依次遞歸,如果父類加載器可以完成任務,就成功返回,只有父類加載器加載類時,才自己加載。
加載的順序是,從上往下,依次是,父類啓動類---》 程序類加載器----〉擴展類加載器--------》其他類加載器。
檢查己加載的順序是從下往上,依次是,子類(其它類加載器)----〉擴展類加載器-----》程序類加載器-----〉父類加載器。
8.運行時數據區:
方法區:
用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據,線程共享的。
堆區:該堆區在內存中時最大的一塊存儲區,用來分配存儲對象,線程也是共享的。
本地方法棧:本地的方法在此棧中保存。
虛擬機棧:是一個線程執行的過程,保存的線程調用方法的狀態,虛擬機棧線程是私有的。隨的線程的創建而創建。
程序計數器:佔用內存空間最小的一塊,Java多線程是通過線程輪流切換,分配處理器執行時間的方式來實現的,也是線程私有的。
9.內存模型
內存中對線程區共享的只有堆區和方法區。
一塊是堆區,一塊是非堆區。
堆區裏面分爲Old和young。young裏面分爲Eden區和surialvs區,而s區又可以分爲s0,s1區。
圖示理解:
一般情況下,新創建的對象都會被分配到Eden區,一些特殊的大的對象會直接分配到Old區。
比如有對象A,B,C等創建在Eden區,但是Eden區的內存空間肯定有限,比如有100M,假如已經使用了100M或者達到一個設定的臨界值,這時候就需要對Eden內存空間進行清理,即垃圾收集(Garbage Collect),這樣的GC我們稱之爲Minor GC,Minor GC指得是Young區的GC。
經過GC之後,有些對象就會被清理掉,有些對象可能還存活着,對於存活着的對象需要將其複製到Survivor區,然後再清空Eden區中的這些對象。