深刻理解Java虛擬機二 閱讀筆記

xl_echo編輯整理。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這纔是真正的堪稱強大!!算法

如下內容摘抄自《深刻理解Java虛擬機JVM高級特性與最佳實踐 第2版220》,博主徹底尊重書籍原創,只是學習筆記摘抄部分,因爲不是原創,不支持轉載。若有侵權請聯繫博主(微信號:t2421499075)。編程

Java是一門面向對象的編程語言,在程序運行過程當中每時每刻都有對象被建立,咱們在寫代碼的時候,能夠看到建立對象僅僅只是new關鍵字而已,而虛擬機中建立確實一個比較複雜的過程。微信

虛擬機內部建立對象流程圖

在這裏插入圖片描述

GC回收對象

對象是否還「存活」Java程序運行產生了不少對象實例,垃圾收集器在對堆進行回收前都會判斷對象是否還「存活」編程語言

對象是否存活算法

  • 引用計數算法
  • 可達性分析算法

引用計數算法

給對象中添加一個引用計數器,每當有一個地方引用它的時候,計數器值就加1,當引用失效時計數器值就減1.大部分的結果都是當計數器統計完成技術值爲0,那麼該對象就是已經能夠被回收。(它不能解決循環引用的問題)學習

可達性分析算法(GC採用的算法)

該算法的基本思路就是經過可達性分析來斷定對象是否存活的。這個算法的基本思路就是經過一系列的成爲「GC Roots」的對象做爲起點,從這些節點開始向下搜索搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots沒有任何引用鏈項鍊時,證實對象是能夠回收的對象

垃圾收集算法

  • 標記-清除算法
  • 複製算法
  • 標記-整理算法
  • 分代收集算法

標記-清除算法

最基礎的收集算法是標記-清除算法,如同它的名字同樣,算法爲標記和清除兩個階段:首先標記處全部須要回收的對象,在標記完成後統一回收全部被標記的對象。不少其餘的算法都是基於標記清除這種算法的思想,因此說它是最基礎的算法blog

複製算法

爲了解決效率問題,一種稱爲複製的收集算法出現了。它將內存分爲兩塊對等大小,每次使用一塊,當這一塊使用完成,就將還存活的對象複製到另外一塊內存,一次性清除使用完成的那一塊。它的優勢就是實現簡單,運行高效。圖片

標記-整理算法

複製收集算法在對象存活率較高時就要進行較多的複製操做,效率將會下降。標記過程與標記-清除算法同樣,但後續步驟不是直接對可回收對象進行清理,而是讓全部存活的對象都向一端移動,而後直接清理掉端邊界之外的內存內存

分代收集算法

這種算法實際上是將內存劃分爲不一樣的幾塊,通常是把Java堆分爲新生代和老年代,根據不一樣的年代的特色選用上面的適合的算法。虛擬機

相關文章
相關標籤/搜索