Java平臺與內存管理的學習筆記

Java的解釋執行

  • Java解釋執行的對象是 .class 字節碼文件(由編譯器生成)

  • Java字節碼的執行分三步:

    1. 代碼的裝入:由類加載器完成
    2. 代碼的校驗:由字節碼校驗器完成
    3. 代碼的執行
  • Java字節碼的執行分兩類:

    1. 即時編譯方式:解釋器先將字節碼編譯成機器碼,然後再執行
    2. 解釋執行方式:每次解釋並執行一小段代碼,這也是常用的方式

JVM加載class文件

類只有被加載到JVM中才能運行執行程序,JVM會將編譯生成的字節碼文件按需求和規則加載到內存中,並組織成一個完整的JAVA應用程序。

  • 類的加載方式主要由兩種:

    1. 隱式加載:當使用new等方式創建對象時,會隱式調用類的加載器
    2. 顯式加載:通過class.forName()方式來把所需的類加載到JVM中
  • 類的加載器主要由三種:

    1. Bootstrap Loader : 負責加載系統類(jre/lib/rt.jar)
    2. ExtClassLoader: 負責加載擴展類(jar/lib/ext/*.jar)
    3. AppClassLoader: 負責加載應用類(classpath 指定的目錄或jar中的類)

    三種類加載使用委託的方式來工作,首先讓父類來加載,如果沒有對應的類,就交給子類來加載。
    上面寫的三種類加載器順序表示繼承的關係,Bootstrap是最底層的類,由c++語言實現。

GC(垃圾回收器)

  • 主要完成三個任務:
    1. 分配內存
    2. 確保被引用的對象不被錯誤的回收
    3. 回收不被引用的對象
  • 使用有向圖來記錄和管理堆內存中的所有對象
  • 垃圾回收的算法:
    1. 引用計數算法:給對象增加一個引用計數器,被引用時加一,引用計數爲零就被回收,無法解決兩個對象互相引用的問題
    2. 追蹤回收算法:遍歷並標記有向圖的節點,未被標記的對象則可回收
    3. 壓縮回收算法:將活動對象移動到堆中的一端,簡化了碎片回收工作,但對性能影響較大
    4. 複製回收算法:將堆分爲兩個區域,當其中一個區域消耗完,就把活動對象複製到另一區域,
    5. 按代回收算法:把堆分爲多個子堆,每個子堆被視爲一代,優先回收年幼的對象,對象存活的越久,代數越高。

堆和棧的區別

主要用來存放基本類型變量和引用變量
棧內存的管理主要通過壓棧和彈棧來實現,以棧幀爲基本單位來管理程序的調用關係

  • 當程序調用時,以壓棧的方式創建棧幀
  • 當程序返回時通過彈棧來釋放棧幀

  • 主要用來存放運行時創建的對象
  • 一般通過new關鍵字創建的對象都在堆內存中
  • 每個java程序都運行在一個jvm實例上,每個實例對應一個堆
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章