最近復(fù)習Java基礎(chǔ)細節(jié)的時候看Thking in Java;書上有提到兩種垃圾回收機制践啄,“停止-復(fù)制”浇雹、“標記-清掃”;
停止-復(fù)制:將暫停程序的運行往核,然后將所有存活的對象從當前堆復(fù)制到另一個堆箫爷,而沒有被復(fù)制的對象都是垃圾魂角;當對象被復(fù)制到新堆時岂津,它們是一個挨著一個的色难,所以新堆保持緊湊排列外潜;然后就可以直接分配新空間了
標記-清掃:從堆棧和靜態(tài)存儲區(qū)出發(fā)吸耿,遍歷所有的引用遮咖,進而找出所有存活的對象睡腿;每找到一個存活對象买羞,就會給對象一個標記非春,這個過程不會回收任何對象柱徙;當全部標記工作完成時,清掃動作開始奇昙;
JVM采用自適應(yīng)的垃圾回收機制:JVM會進行監(jiān)視护侮,若所有對象都很穩(wěn)定,垃圾回收器效率降低储耐,就切換為“標記-清掃”模式羊初;當JVM跟蹤“標記-清掃”的效果,發(fā)現(xiàn)堆空間有很多碎片時,就會切換回“停止-復(fù)制”方式长赞;
垃圾回收
垃圾回收又稱gc晦攒,gc是運行在JVM中,回收應(yīng)用程序中創(chuàng)建的無用的對象
什么是垃圾
垃圾就是沒有任何價值得哆,沒有任何用的東西
如何判斷垃圾
Java通過引用于對象進行關(guān)聯(lián)脯颜,操作一個對象;被引用相關(guān)聯(lián)的就不是垃圾贩据;
那么沒有引用指向這個對象栋操,也就是說該對象已經(jīng)沒有任何引用,那么它就是垃圾乐设;
判定“垃圾”的方法
引用計數(shù)算法
1.給對象添加計數(shù)器讼庇,如果引用,計數(shù)器+1近尚;
2.引用失效蠕啄,則計數(shù)器-1;
3.任何時刻計數(shù)器為0的對象不能再使用了根搜索法
1.gc roots為起點戈锻,從這個節(jié)點開始向下搜索
2.所走過的路徑歼跟,用Wie引用鏈
3.對象到gc roots沒有任何鏈相連,對象不可用
常見的垃圾回收場景
對象被賦值null格遭,或手動釋放
弱引用
若一個對象具有弱引用哈街,在GC線程掃描內(nèi)存區(qū)域的過程中,不管當前內(nèi)存空間足夠與否拒迅,都會回收內(nèi)存骚秦,使用弱引用 構(gòu)建非敏感數(shù)據(jù)的緩存。
弱引用申明:
WeakReferenceweakReference=new WeakReference(new User());
-
虛引用
如果一個對象僅持有虛引用璧微,在任何時候都可能被垃圾回收作箍,虛引用與軟引用和弱引用的一個區(qū)別在于:虛引用必須和引用隊列聯(lián)合使用,虛引用主要用來跟蹤對象 被垃圾回收的活動前硫。
虛引用申明:
PhantomReference phantomReference=new PhantomReference(new User(),new ReferenceQueue());
gc回收器
-
gc的劃分
新域:儲存所有生成的對象
舊域:新域中的對象經(jīng)過幾次gc之后胞得,沒有被回收,進入舊域中
永久域:存儲類和方法對象屹电,從配置的角度看阶剑,這個域是獨立的,不包括在JVM堆內(nèi)危号。默認為4M牧愁。
-
新域
新域中會被分為三個部分:一個緩沖區(qū),兩個休閑區(qū)
新域中外莲,產(chǎn)生的大部分對象都會被回收猪半,少部分進入舊域
1.第一個部分叫做Eden(伊甸園)
2.輔助的生成空間(幼兒園)
A空間…
B空間…
舊域
舊域也被分為幾部分,但是舊域中,存活的對象就比較多办龄,所以,舊域中一般回收的對象會比較少永久域
一路下來淋昭,如果對象還未被回收俐填,那么久會流入永久域中存起來,并不是對象到這里了翔忽,gc就不去回收了英融,只是gc不太會去回收這里面的對象。
垃圾回收器算法
Mark-Sweep算法
Copying算法
Mark-Compact算法:為了解決空間浪費問題而改進的算法歇式;
1.標記階段和Mark-Sweep一樣
2.完成標記后驶悟,不直接清除回收對象,將對象移向一段
3.清理邊界內(nèi)存Generational Collection算法(分代收集法):根據(jù)存活的生命周期分為了:新生代材失,老年代和永久代痕鳍,也就是新區(qū),舊區(qū)和永久區(qū)
1.根據(jù)存活的生命周期將內(nèi)存分為若干個區(qū):新生代和老年代和永久代
2.新生代:每次都回收大量對象——>Copying復(fù)制法
3.老年代:每次都回收少量對象——>Mark-Compact法
4.永久代:存儲class類龙巨,常量笼呆,方法描述:回收廢棄常量和無用類
看了CSDN上曾淘前輩的這篇博文后,我想分代收集法應(yīng)該就是Thking in Java中所描述的自適應(yīng)方法
出處:http://blog.csdn.net/u011546655/article/details/52186044
資料借鑒:《Thking in Java》