天天看點

深入了解Java虛拟機(二)-----垃圾回收(GC)

什麼是GC

gc指的就是java虛拟機垃圾回收,它回收區域針對的對象是堆記憶體和方法區,因為棧記憶體(本地方法棧和虛拟機棧在hotspot虛拟機中統稱為棧)它隻存活于方法運作時,是由虛拟機自動進行垃圾回收的,不需要程式員關心

Minor GC:對新生代對象的垃圾回收

Full GC(Major GC):對老年代區對象的回收

如何判斷對象可回收

1、引用計數算法(過時):對象被引用,它的引用計數器就會+1,引用失效-1,到0就意味對象不再使用,因為它無法解決對象之間互相引用的問題 雖然過時了,但可聯想到對像年齡計數器,異曲同工之妙。在将長期存活的大對象存入老年代時提及

2、可達性分析算法(重要知識):當對象到GC Roots鍊不存在一條任何引用鍊時,可了解從gc roots沒有路方法該對象。意味對象不再被使用。

深入了解Java虛拟機(二)-----垃圾回收(GC)
  • 可作為gc roots對象:
  • 虛拟機棧中引用的對象
  • 方法區類靜态變量和常量引用的對象
  • native方法引用的對象

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

垃圾收集算法

1、标記-清除算法:會産生記憶體碎片并且效率低

深入了解Java虛拟機(二)-----垃圾回收(GC)

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、虛引用:沒有實際的虛拟機回收意義,隻是要求虛拟機在對其進行回收時需要通知一聲

繼續閱讀