JVM的垃圾收集

       上一章主要講解了jvm的內存組成。這一章,來說一下,jvm中的垃圾回收。

垃圾回收策略

引用計數法

       比較古老的回收算法。原理是此對象有一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計數爲0的對象。此算法最致命的是無法處理循環引用的問題。

標記清除法

標記清除
       此算法執行分兩階段。第一階段從引用根節點開始標記所有被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法需要暫停整個應用,同時,會產生內存碎片。

複製法

複製法
       此算法把內存空間劃爲兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象複製到另外一個區域中。次算法每次只處理正在使用中的對象,因此複製成本比較小,同時複製過去以後還能進行相應的內存整理,不會出現“碎片”問題。當然,此算法的缺點也是很明顯的,就是需要兩倍內存空間。

標記壓縮法

標記壓縮
       此算法結合了“標記-清除”和“複製”兩個算法的優點。也是分兩階段,第一階段從根節點開始標記所有被引用對象,第二階段遍歷整個堆,把清除未標記對象並且把存活對象“壓縮”到堆的其中一塊,按順序排放。此算法避免了“標記-清除”的碎片問題,同時也避免了“複製”算法的空間問題。

垃圾收集算法

       根據上一篇文章的內存結構。堆中是分區域的。不同的區域有不同的策略。

Young代回收算法:

       因爲Young代都是短命對象,一次YoungGC會回收大部分對象,只有少量會剩下來。ParNew採用多線程,Stop The World的方式,採用複製算法進行回收。
ParNew收集
特點:
- Stop The Workd
- 多線程併發回收
- 複製算法,內存回收後方便分配

Old代回收算法:

cms收集器

回收步驟

  • 初始化清除:Stop The World 標記由根可以直達的對象
  • 併發標記:併發標記可達對象
  • 重新標記:Stop The World併發查找前一階段新生代晉升或者新分配,被
  • 更新的對象
  • 併發清理
  • 線程重置

優點

  • 低延遲

缺點

  • 因爲是基於標記清除,容易產生碎片

小結:

       雖然我不認爲學習java必須去了解Java底層的實現,但是我想如果你更加理解JVM和GC的話,你就會更加理解Java,在以後的學習和工作中絕對受益匪淺。畢竟我們的目標不是刷牆工,不是搬運工,而是開發攻城獅啊!

發佈了150 篇原創文章 · 獲贊 99 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章