深入理解Java虛擬機(二)-----垃圾回收(GC)

什麼是GC

gc指的就是java虛擬機垃圾回收,它回收區域針對的對象是堆內存和方法區,因爲棧內存(本地方法棧和虛擬機棧在hotspot虛擬機中統稱爲棧)它只存活於方法運行時,是由虛擬機自動進行垃圾回收的,不需要程序員關心
Minor GC:對新生代對象的垃圾回收
Full GC(Major GC):對老年代區對象的回收

如何判斷對象可回收

1、引用計數算法(過時):對象被引用,它的引用計數器就會+1,引用失效-1,到0就意味對象不再使用,因爲它無法解決對象之間相互引用的問題 雖然過時了,但可聯想到對像年齡計數器,異曲同工之妙。在將長期存活的大對象存入老年代時提及
2、可達性分析算法(重要知識):當對象到GC Roots鏈不存在一條任何引用鏈時,可理解從gc roots沒有路方法該對象。意味對象不再被使用。

這裏寫圖片描述

  • 可作爲gc roots對象:
  • 虛擬機棧中引用的對象
  • 方法區類靜態變量和常量引用的對象
  • native方法引用的對象

3、虛擬機在判斷對象死沒死是對這個對象進行了兩次標記,如果第二次標記這個對象還是不存在引用鏈,那它就會被放到回收隊列中,接下來被虛擬機回收掉

垃圾收集算法

1、標記-清除算法:會產生內存碎片並且效率低
這裏寫圖片描述
2、複製算法:解決了標記-清除算法產生內存碎片的問題,它是對新生代通過一個Eden區域和兩個Survivor區域進行垃圾回收,其中eden區域內存大的多(8:1),因爲大多數對象死得快,只有少數對象能活下來。每次只用一到一個survivor區域,另一個用作存放活下來的對象
3、標記-整理算法:對老年代中的對象進行回收,它是採用讓存活的對象往一端移動,然後清理掉端邊界以外的內存(這裏就是存放的要回收的對象)
4、分代收集算法:根據GC對象的特點分別選取最適合的回收算法,對於新生代對象一般採用複製算法,對於老年代對象採用標記-清理或者標記-整理算法回收

幾種垃圾收集器

1、Serial收集器:針對新生代的單線程收集器,用於client模式下
2、parNew收集器:針對新生代的多線程收集器,支持併發,搭配CMS收集器使用,用於server模式下
3、Parallel Scavenge收集器:儘可能縮短GC停頓時間,控制吞吐量
4、CMS收集器:在互聯網方向主流的收集器,因爲它致力於讓GC停頓時間最短,對互聯網加速響應的要求相應相得益彰。缺點:產生浮動垃圾、還是會產生內存碎片、用線程佔用了CPU資源

四種不同的對象引用類型

1、強引用:對象只要存在強引用(採用new ),對象就不會被虛擬機回收
2、軟引用:在內存不足的情況下,會對這類引用對象進行回收
3、弱引用:只能存活一次回收時間,即再虛擬機進行下一次回收時必然回收此類引用對象
4、虛引用:沒有實際的虛擬機回收意義,只是要求虛擬機在對其進行回收時需要通知一聲

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