Java的解釋執行
-
Java解釋執行的對象是 .class 字節碼文件(由編譯器生成)
-
Java字節碼的執行分三步:
- 代碼的裝入:由類加載器完成
- 代碼的校驗:由字節碼校驗器完成
- 代碼的執行
-
Java字節碼的執行分兩類:
- 即時編譯方式:解釋器先將字節碼編譯成機器碼,然後再執行
- 解釋執行方式:每次解釋並執行一小段代碼,這也是常用的方式
JVM加載class文件
類只有被加載到JVM中才能運行執行程序,JVM會將編譯生成的字節碼文件按需求和規則加載到內存中,並組織成一個完整的JAVA應用程序。
-
類的加載方式主要由兩種:
- 隱式加載:當使用new等方式創建對象時,會隱式調用類的加載器
- 顯式加載:通過class.forName()方式來把所需的類加載到JVM中
-
類的加載器主要由三種:
- Bootstrap Loader : 負責加載系統類(jre/lib/rt.jar)
- ExtClassLoader: 負責加載擴展類(jar/lib/ext/*.jar)
- AppClassLoader: 負責加載應用類(classpath 指定的目錄或jar中的類)
三種類加載使用委託的方式來工作,首先讓父類來加載,如果沒有對應的類,就交給子類來加載。
上面寫的三種類加載器順序表示繼承的關係,Bootstrap是最底層的類,由c++語言實現。
GC(垃圾回收器)
- 主要完成三個任務:
- 分配內存
- 確保被引用的對象不被錯誤的回收
- 回收不被引用的對象
- 使用有向圖來記錄和管理堆內存中的所有對象
- 垃圾回收的算法:
- 引用計數算法:給對象增加一個引用計數器,被引用時加一,引用計數爲零就被回收,無法解決兩個對象互相引用的問題
- 追蹤回收算法:遍歷並標記有向圖的節點,未被標記的對象則可回收
- 壓縮回收算法:將活動對象移動到堆中的一端,簡化了碎片回收工作,但對性能影響較大
- 複製回收算法:將堆分爲兩個區域,當其中一個區域消耗完,就把活動對象複製到另一區域,
- 按代回收算法:把堆分爲多個子堆,每個子堆被視爲一代,優先回收年幼的對象,對象存活的越久,代數越高。
堆和棧的區別
棧
主要用來存放基本類型變量和引用變量
棧內存的管理主要通過壓棧和彈棧來實現,以棧幀爲基本單位來管理程序的調用關係
- 當程序調用時,以壓棧的方式創建棧幀
- 當程序返回時通過彈棧來釋放棧幀
堆
- 主要用來存放運行時創建的對象
- 一般通過new關鍵字創建的對象都在堆內存中
- 每個java程序都運行在一個jvm實例上,每個實例對應一個堆