深刻JVM-自動內存管理(讀書筆記)

自動內存管理

  • 運行時數據區域
    • 程序計數器
    • Java虛擬機棧
      • Java方法執行的線程內存模型
      • 每一個方法在Java方法中的體現是棧幀
    • 本地方法棧
      • 棧幀內專門爲本地方法服務
    • Java堆
      • 被全部線程共享
      • 惟一目的是存放對象
      • 垃圾收集器管理的內存區域(因此也有人稱之爲」GC「堆)
        • 堆內實際有線程私有的對象緩存區,來提高線程獲取對象的效率
    • 方法區
      • 與方法自己的關係並不大,而更多的是存儲的常量、靜態變量、類型信息等。
      • 運行時常量池
    • 直接內存
  • HotSpot虛擬機與堆中對象分配、佈局、訪問
    • 對象分配
      • 可用空間的劃分
        • 規整的狀況下:平移指針
        • 不規整的狀況下:空閒列表
        • 併發衝突
          • 緩衝+同步鎖/CAS
      • 內存初始化
        • 分配完內存後,進行內存初始化(賦零值)
          • 保證了成員變量默認狀況下適用就是零值
      • 構造函數初始化
    • 對象內存佈局
      • 對象頭、實例數據、空白對齊的padding
    • 對象的訪問
      • 經過棧上的reference訪問
        • 經過句柄來訪問
          • reference->句柄->地址
        • 經過指針來訪問(HotSpot採用)
          • reference->地址

垃圾收集器與內存分配策略

  • 對象是否」死亡「算法

    • 引用計數法(不採用)
      • 沒法解決循環引用的問題
    • 可達性分析(採用)
      • 判斷從GC Root是否可達該結點
  • 引用的分級緩存

    • 只用」被引用「和」未被引用「沒法充分描述對象的引用情況
      • 好比對於這種場景:當內存空間還足夠時,能保留在內存之中,若是內存空間在進行垃圾收集後仍然很是緊張,就扔掉它(緩存)
    • 強引用
      • 指在程序代碼之中廣泛存在的引用賦值,即相似「Object obj=new Object()」這種引用關係
    • 軟引用
      • 有用,但非必須的對象
      • 只被軟引用關聯着的對象,在系統將要發生內存溢出異常前,會把這些對象列進回收範圍之中進行第二次回收,若是此次回收尚未足夠的內存,纔會拋出內存溢出異常
      • SoftReference
    • 弱引用
      • 被弱引用關聯的對象只能生存到下一次垃圾收集發生爲止
      • WeakReference
    • 虛引用
      • 沒啥用
  • 垃圾收集算法併發

    • 分代收集理論
      • 弱分代假說:絕大多數對象都是朝生夕滅
      • 強分代假說:熬過越屢次垃圾收集的對象越難消亡
      • 跨代假說:跨代引用僅佔少數
      • 收集器應該將Java堆劃分出不一樣的區域,而後將回收對象依據其年齡(年齡即對象熬過垃圾收集過程的次數)分配到不一樣的區域之中存儲
      • 標記清除算法
        • 主要問題
          • 容易纏身過多的空間碎片
      • 標記複製算法
        • 內存分兩辦,用一半,剩下的一半在每次垃圾收集的時候,存放活着的對象,原來的一半被清空
        • 主要問題
          • 若是存活對象過多,那麼複製開銷大
      • 標記-整理算法
        • 標記清除+移動
  • HotSpot的算法細節實現函數

  • 經典垃圾收集器佈局

    • Serial收集器線程

    • G1指針

    • ZGC對象

相關文章
相關標籤/搜索