java gc回收机制种类_JAVA的垃圾回收机制(GC)
1.什么是垃圾回收?
垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供的一種用于在空閑時間不定時回收無任何對象引用的對象占據的內存空間的一種機制。
2.什么時候垃圾回收?
System.gc()
Runtime.getRuntime().gc()
上面的方法調用時用于顯式通知JVM可以進行一次垃圾回收,但真正垃圾回收機制具體在什么時間點開始發生動作這同樣是不可預料的,這和搶占式的線程在發生作用時的原理一樣。
3.垃圾回收 回收的是什么?
垃圾回收回收的是無任何引用的對象占據的內存空間而不是對象本身。換言之,垃圾回收只會負責釋放那些對象占有的內存。對象是個抽象的詞,包括引用和其占據的內存空間。當對象沒有任何引用時其占據的內存空間隨即被收回備用,此時對象也就被銷毀。但不能說是回收對象,可以理解為一種文字游戲。
4.垃圾回收 回收什么對象?
從gc root搜索不到,而且經過第一次標記、清理后,仍然沒有復活的對象。
5.垃圾回收器將某些特殊的對象定義為GC根對象。所謂的GC根對象包括?
1.虛擬機棧中引用的對象(棧幀中的本地變量表);
2.方法區中的常量引用的對象;
3.方法區中的類靜態屬性引用的對象;
4.本地方法棧中JNI(Native方法)的引用對象。
5.活躍線程
接下來,垃圾回收器會對內存中的整個對象圖進行遍歷,它先從GC根對象開始,然后是根對象引用的其它對象,比如實例變量。回收器將訪問到的所有對象都標記為存活。
當標記階段完成了之后,所有的存活對象都已經被標記完了。其它的那些(上圖中灰色的那些)也就是GC根對象不可達的對象,也就是說你的應用不會再用到它們了。這些就是垃圾對象,回收器將會在接下來的階段中清除它們。
6.GC 回收機制
新生代GC(Minor GC/Scavenge GC):發生在新生代的垃圾收集動作。因為Java對象大多都具有朝生夕滅的特性,因此Minor GC非常頻繁(不一定等Eden區滿了才觸發),一般回收速度也比較快。在新生代中,每次垃圾收集時都會發現有大量對象死去,只有少量存活,因此可選用復制算法來完成收集。
老年代GC(Major GC/Full GC):發生在老年代的垃圾回收動作。Major GC,經常會伴隨至少一次Minor GC。由于老年代中的對象生命周期比較長,因此Major GC并不頻繁,一般都是等待老年代滿了后才進行Full GC,而且其速度一般會比Minor GC慢10倍以上。另外,如果分配了Direct Memory,在老年代中進行Full GC時,會順便清理掉Direct Memory中的廢棄對象。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用標記—清除算法或標記—整理算法來進行回收。
新生代采用空閑指針的方式來控制GC觸發,指針保持最后一個分配的對象在新生代區間的位置,當有新的對象要分配內存時,用于檢查空間是否足夠,不夠就觸發GC。當連續分配對象時,對象會逐漸從Eden到Survivor,最后到老年代。
7.引用類型
對象引用類型分為強引用、軟引用、弱引用和虛引用
強引用:就是我們一般聲明對象時虛擬機生成的引用,強引用環境下,垃圾回收時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收。
軟引用:軟引用一般被作為緩存來使用。與強引用的區別是,軟引用在垃圾回收時,虛擬機會根據當前系統的剩余內存來決定是否對軟引用進行回收。如果剩余內存比較緊張,則虛擬機會回收軟引用所引用的空間,如果剩余內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,肯定是沒有軟引用存在的。
弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,因此其生命周期只存在于一個垃圾回收周期內。
強引用不用說,我們系統一般在使用時都是用的強引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內存比較受限的情況下作為緩存。
因為如果內存足夠大的話,可以直接使用強引用作為緩存即可,同時可控性更高。因而,他們常見的是被使用在桌面應用系統的緩存。
虛引用顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。
總結
以上是生活随笔為你收集整理的java gc回收机制种类_JAVA的垃圾回收机制(GC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php mysql html标签_HTM
- 下一篇: 新加坡推出“冲厕水啤酒”:首批已快卖光!