二.垃圾回收

垃圾回收的對象

我們申請的幾乎所有對象都存儲在堆上,并且堆空間在進程啟動時就已經創(chuàng)建了一個初始化的空間,隨著程序的運行蕴侣,堆內存的使用率/大小增長情況下缠犀,為保證程序的內存空間足夠使用数苫,jvm會不定期的對不再使用的對象進行回收,這個過程就是GC辨液。
關于內存結構可以參看上一節(jié)內容虐急。

引用類型

  • 強引用,強引用是對對象的強制引用室梅,只要有強引用關聯(lián)垃圾回收器就不會回收該對象戏仓。
  • 軟引用,SoftReference亡鼠,系統(tǒng)會在即將發(fā)生內存溢出時回收該類引用赏殃,回收后若還是內存不足才會拋出內存溢出,該引用用在一些最好有间涵,但也不是必須的對象引用上
  • 弱引用仁热,WeakReference,系統(tǒng)會在下一次GC時回收該引用對象勾哩,這里用在不阻礙回收的內存引用上抗蠢,常用于一些會導致內存泄漏的對象引用上
  • 虛引用,PhantomReference思劳,幽靈引用迅矛,最弱(隨時會被回收掉),垃圾回收的時候收到一個通知,就是為了監(jiān)控垃圾回收器是否正常工作潜叛。

分配在棧上的對象引用不會參與GC

jvm為優(yōu)化內存回收設計了逃逸對象分析秽褒。
逃逸算法是針對棧幀中創(chuàng)建的臨時對象,若該對象會被當做參數(shù)傳遞到其他方法則滿足逃逸的條件威兜。
如果該對象還會被外部線程訪問销斟,則滿足線程逃逸條件。
滿足線程逃逸條件的對象會在堆內存中創(chuàng)建椒舵,而只滿足全局逃逸條件的對象則可在棧中分配內存創(chuàng)建蚂踊,這種對象將不會參與GC,生命周期跟隨棧(即線程)

垃圾回收算法

  • 垃圾收集

1.可達性分析

這個算法的基本思路是以RC Roots為起始點笔宿,找出所有被RC Roots引用的對象犁钟,之后回收那些沒有被引用的對象棱诱。
RC Roots包括以下幾種對象

  • 方法區(qū)中靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象
  • 虛擬機棧(棧幀中的本地變量表)中引用的對象
  • 本地方法棧JNI(native方法)中引用的對象
  • jvm的內部引用(class對象,異常對象NullPointException特纤、OutofMemoryError军俊,系統(tǒng)類加載)
  • 所有被同步鎖(synchronized)持有的對象
  • JVM 內部的JMXBean、JVMTI 中注冊的回調捧存、本地代碼緩存等
  • JVM 實現(xiàn)中的“臨時性”對象粪躬,跨代引用的對象(在使用分代模型回收只回收部分代時)
2.引用計數(shù)

這個算法比較好理解,在對象中添加一個引用計數(shù)昔穴,當有對象引用該對象則計數(shù)加一镰官,當引用失效則計數(shù)減一,不過目前主流的虛擬機都沒有使用這個算法吗货,原因是這個算法在處理相互引用的情況時需要額外的機制來協(xié)助計算泳唠,這樣做的效率不是很高

  • 垃圾回收

1.分代收集回收理論

分代收集理論是在以上兩種收集算法基礎上的一個優(yōu)化算法,它將對象分為新生代和老年代宙搬,經過多次(不同的垃圾回收器不同有的是15有的是6)回收計算都沒有被回收的對象叫做老年代笨腥,有一些垃圾回收器會將大對象直接放入老年代,有些回收時可選擇
1勇垛、新生代回收(Minor GC/Young GC):指只是進行新生代的回收脖母。
2、老年代回收(Major GC/Old GC):指只是進行老年代的回收闲孤。目前只有CMS 垃圾回收器會有這個單獨的收集老年代的行為谆级。(Major GC 定義是比較混
亂,有說指是老年代讼积,有的說是做整個堆的收集肥照,這個需要你根據別人的場景來定,沒有固定的說法)
3勤众、整堆收集(Full GC):收集整個Java 堆和方法區(qū)(注意包含方法區(qū))

2.復制算法

將可用內存按照容量劃分為大小相同的兩塊舆绎,每次只使用其中的一塊,垃圾回收時將存活的對象復制到另一塊上们颜,然后再將這塊內存整個清理掉吕朵,這樣不僅沒有內存碎片的問題,而且實現(xiàn)簡單掌桩,運行高效;當然缺點也是很明顯的姑食,只能使用一半的內存空間

3.標記清除算法

這個算法比較好理解波岛,垃圾收集時將可回收的對象做標記,垃圾回收時將標記的對象清理掉音半,它的缺陷是這種回收會產生大量的內存碎片则拷,過多的內存碎片的存在將導致在創(chuàng)建大對象時由于找不到連續(xù)的內存空間將會導致另一次垃圾回收贡蓖,且存在內存浪費

4.標記-整理算法

該算法是在標記清除算法上的一個進階,垃圾收集時將需要回收的對象打上標記煌茬,然后將所有存活的對象向一端移動斥铺,最后清理掉末端邊界以外的對象,這種算法雖然不會有內存碎片坛善,但效率偏低晾蜘。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眠屎,隨后出現(xiàn)的幾起案子剔交,更是在濱河造成了極大的恐慌,老刑警劉巖改衩,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖常,死亡現(xiàn)場離奇詭異,居然都是意外死亡葫督,警方通過查閱死者的電腦和手機竭鞍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄镜,“玉大人偎快,你說我怎么就攤上這事◎嚷梗” “怎么了滨砍?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妖异。 經常有香客問我惋戏,道長,這世上最難降的妖魔是什么他膳? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任响逢,我火速辦了婚禮,結果婚禮上棕孙,老公的妹妹穿的比我還像新娘舔亭。我一直安慰自己,他們只是感情好蟀俊,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布钦铺。 她就那樣靜靜地躺著,像睡著了一般肢预。 火紅的嫁衣襯著肌膚如雪矛洞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天烫映,我揣著相機與錄音沼本,去河邊找鬼噩峦。 笑死,一個胖子當著我的面吹牛抽兆,可吹牛的內容都是我干的识补。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼辫红,長吁一口氣:“原來是場噩夢啊……” “哼凭涂!你這毒婦竟也來了?” 一聲冷哼從身側響起厉熟,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤导盅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揍瑟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白翻,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年绢片,在試婚紗的時候發(fā)現(xiàn)自己被綠了滤馍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡底循,死狀恐怖巢株,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情熙涤,我是刑警寧澤阁苞,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站祠挫,受9級特大地震影響那槽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜等舔,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一骚灸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慌植,春花似錦甚牲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至交汤,卻和暖如春雏赦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工喉誊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵顾。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓伍茄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親施逾。 傳聞我的和親對象是個殘疾皇子敷矫,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 垃圾回收 1.如何判斷對象可以回收 1.1 引用計數(shù) 在對象中添加一個引用計數(shù)器,每當有一個地方引用它汉额,計數(shù)器值就...
    韓who閱讀 221評論 1 0
  • jvm經過多年的發(fā)展曹仗,它的垃圾回收算法也經過了幾個迭代。本文主要介紹垃圾回收算法及目前hotspot上實現(xiàn)的垃圾回...
    住在山丘上閱讀 199評論 2 1
  • 對象的創(chuàng)建 給對象分配內存 1.指針碰撞 2.空間列表 線程安全問題 1.線程同步(基本不用) 2.本地線程分配緩...
    要不再等等閱讀 239評論 0 0
  • 參考:《深入理解JVM——高級特性與最佳實踐》 一、對象生存周期 程序計數(shù)器妓灌、虛擬機棧轨蛤、本地方法棧隨線程生滅,不需...
    不會逃跑的木頭人閱讀 313評論 0 0
  • 我剛工作的時候問一個前輩虫埂,我們能針對JVM做出什么樣的優(yōu)化。前輩說掉伏,我們系統(tǒng)現(xiàn)在的性能并不需要調優(yōu)缝呕,用默認的配置就...
    九里閱讀 216評論 0 0