深刻JVM-自動內存管理(讀書筆記)
自動內存管理
- 運行時數據區域
-
- 程序計數器
- Java虛擬機棧
- Java方法執行的線程內存模型
- 每一個方法在Java方法中的體現是棧幀
- 本地方法棧
- Java堆
- 被全部線程共享
- 惟一目的是存放對象
- 垃圾收集器管理的內存區域(因此也有人稱之爲」GC「堆)
- 堆內實際有線程私有的對象緩存區,來提高線程獲取對象的效率
- 方法區
- 與方法自己的關係並不大,而更多的是存儲的常量、靜態變量、類型信息等。
- 運行時常量池
- 直接內存
- HotSpot虛擬機與堆中對象分配、佈局、訪問
- 對象分配
- 可用空間的劃分
- 規整的狀況下:平移指針
- 不規整的狀況下:空閒列表
- 併發衝突
- 內存初始化
- 構造函數初始化
- 對象內存佈局
- 對象的訪問
- 經過棧上的reference訪問
- 經過句柄來訪問
- 經過指針來訪問(HotSpot採用)
垃圾收集器與內存分配策略
-
對象是否」死亡「算法
-
引用的分級緩存
- 只用」被引用「和」未被引用「沒法充分描述對象的引用情況
- 好比對於這種場景:當內存空間還足夠時,能保留在內存之中,若是內存空間在進行垃圾收集後仍然很是緊張,就扔掉它(緩存)
- 強引用
- 指在程序代碼之中廣泛存在的引用賦值,即相似「Object obj=new Object()」這種引用關係
- 軟引用
- 有用,但非必須的對象
- 只被軟引用關聯着的對象,在系統將要發生內存溢出異常前,會把這些對象列進回收範圍之中進行第二次回收,若是此次回收尚未足夠的內存,纔會拋出內存溢出異常
- SoftReference
- 弱引用
- 被弱引用關聯的對象只能生存到下一次垃圾收集發生爲止
- WeakReference
- 虛引用
-
垃圾收集算法併發
- 分代收集理論
- 弱分代假說:絕大多數對象都是朝生夕滅
- 強分代假說:熬過越屢次垃圾收集的對象越難消亡
- 跨代假說:跨代引用僅佔少數
- 收集器應該將Java堆劃分出不一樣的區域,而後將回收對象依據其年齡(年齡即對象熬過垃圾收集過程的次數)分配到不一樣的區域之中存儲
- 標記清除算法
- 主要問題
- 容易纏身過多的空間碎片
-
- 標記複製算法
- 內存分兩辦,用一半,剩下的一半在每次垃圾收集的時候,存放活着的對象,原來的一半被清空
- 主要問題
- 若是存活對象過多,那麼複製開銷大
-
- 標記-整理算法
- 標記清除+移動
-
-
HotSpot的算法細節實現函數
-
經典垃圾收集器佈局
歡迎關注本站公眾號,獲取更多信息