.
聲明:本人只是分享一些床長人工智慧教程相關的免費pdf下載文檔而已,並非床長人工智慧網校的收費文章。尊重版權,支持原創!
我們知道調優主要調的是垃圾收集器的選擇和參數的設置,所以我們對垃圾回收的知識必須要掌握了解,不然怎麼調優呢,那麼什麼是垃圾呢,我們類比生活中的垃圾,就是不要的東西,需要清除的東西,那麼第一步就是要找到垃圾,在中我們有兩種方式。
怎麼定義垃圾
引用計數法
給對象中添加一個引用計數器,每當有一個地方引用他時,計數器值就。
當引用失效時,計數器值就。
任何時刻計數器為的對象就是不可能在被使用,判斷為不可達,等待清理。
這個方法幾乎報廢,因為如果相互持有引用,導致永遠不能被回收,大家看下面這段代碼。
。
最後在看下就明白了,最後這個對象已經不可能再被訪問了,但由於他們相互引用著對方,導致它們的引用計數永遠都不會為,通過引用計數算法,也就永遠無法通知收集器回收它們。
這就導致了內存洩露,最後會導致內存溢出。
可達性分析
可達性分析算法的基本思路是,通過一些被稱為引用鏈的對象作為起點,從這些節點開始向下搜索,搜索走過的路徑被稱為,當一個對象到沒有任何引用鏈相連時即從節點到該節點不可達,則證明該對象是不可用的,如下所示。
在中,可作為對象的列表
虛擬機棧棧幀中的本地變量表中引用的對象
本地方法棧中既一般說的方法引用的對象。
方法區中類靜態屬性引用的對象
方法區中常量的引用對象。
類加載器
線程類
垃圾回收算法
在確定了哪些垃圾可以被回收後,垃圾收集器要做的事情就是開始進行垃圾回收,但是這裡面涉及到一個問題是如何高效地進行垃圾回收?這裡一共有三種算法。
標記清除
這是最基礎的垃圾回收算法,標記清除算法分為兩個階段標記階段和清除階段。
標記階段是標記出所有需要被回收的對象,清除階段就是回收被標記的對象所佔用的空間。
缺點
位置不連續,產生碎片
效率偏低,兩遍掃描,標記和清除都比較耗時
複製算法
為了解決算法的缺陷,算法就被提了出來。
它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。
當這一塊的內存用完了,就將還存活著的對象複製到另外一塊上面,然後再把已使用的內存空間一次清理掉,這樣一來就不容易出現內存碎片的問題。
優點沒有碎片,空間連續
缺點導致的內存空間始終空閒浪費!
標記整理
為了解決算法的缺陷,充分利用內存空間,提出了算法。
該算法標記階段和一樣,但是在完成標記之後,它不是直接清理可回收對象,而是將存活對象都向一端移動,然後清理掉端邊界以外的內存。
優點沒有碎片,空間連續
缺點效率偏低,兩遍掃描,指針需要調整
分代收集算法
分代收集算法嚴格來說並不是一種思想或理論,而是融合上述種基礎的算法思想,而產生的針對不同情況所採用不同算法的一套組合拳。
我們知道大多數對象都是朝生夕死的,所以我們把堆分為了新生代老年代,以及永生代裡面叫做元空間,方便他們按照不同的代進行不同的垃圾回收。
新生代又被進一步劃分為伊甸園和倖存者區,他們的比例是。
下面我用解來演示一下分代垃圾收集過程
第一步新分配的對象會放在伊甸園,伊甸園滿了就會觸發,會清除包括,在內所有年輕代裡面不用的垃圾。
第二步伊甸園裡面沒有被清除的對象就是倖存下來的,將他們年齡,放到區
第三步伊甸園裡面滿了以後再次觸發,伊甸園倖存的對象年齡放到區,區倖存的對象年齡放到區,這樣區就空出來了
第四步如此反覆
第五步倖存者區達到年齡後,進入到老年代,默認是歲裡默認是歲,這個年齡是可以自己調的
第六步如果老年代內存滿了,就會觸發或者。
觸發就會出現所謂的現象。
內存越大,的時間也越長,所以內存也不僅僅是越大越好。
看了上面的解後我們知道,年輕代用的是複製算法,因為對象大多數生命周期短,回收非常頻繁,用複製算法效率高而老年代用的是標記清除或標記整理算法,因為在老年代對象存活時間比較長,複製來複製去沒必要。
垃圾收集器
垃圾收集器是垃圾回收算法的具體實現,說白了就是落地,我們介紹下面幾個常用的收集器。
收集器是最基本最古老的收集器,它是一個單線程收集器,並且在它進行垃圾收集時,必須暫停所有用戶線程,會。
收集器是針對新生代的收集器,採用的是算法。
收集器是針對老年代的收集器,採用的是算法。
它的優點是實現簡單高效,但是缺點是會給用戶帶來停頓。
參數控制
收集器其實就是收集器的多線程版本,多線程並行進行垃圾收集。
在多核時,比效率高,在單核時和是差不多的。
作用在新生代,使用複製算法,配合使用。
參數控制
收集器是一個新生代的多線程收集器。
他也是並行收集,看上去和一樣,但是更關注系統的吞吐量,其採用的是算法。
是收集器的老年代版本,也是並行收集器,使用多線程和算法,也是更加關注吞吐量。
參數控制
收集器是一種以獲取最短回收停頓時間為目標的收集器,它是一種並發收集器,採用的是算法。
小夥伴注意了並行指的是垃圾回收線程之間並行執行,並發指的是用戶線程和垃圾回收線程一起執行。
它的運作過程相對於前面幾種收集器來說要更複雜一些,整個過程分為個步驟,包括
初始標記
並發標記
重新標記
並發清除
其中初始標記重新標記這兩個步驟仍然需要。
初始標記僅僅只是標記一下能直接關聯到的對象,速度很快,並發標記階段就是進行的過程,而重新標記階段則是為了修正並發標記期間,因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比並發標記的時間短。
由於整個過程中耗時最長的並發標記和並發清除過程中,收集器線程都可以與用戶線程一起工作,所以總體上來說,收集器的內存回收過程是與用戶線程一起並發地執行。
參數控制
收集器是當今收集器技術發展最前沿的成果,它是一款面向服務端應用的收集器,它能充分利用多多核環境。
因此它是一款並行與並發收集器,並且它可以設置停頓時間。
與收集器相比收集器有以下特點
空間整合,收集器採用標記整理算法,不會產生內存空間碎片。
分配大對象時不會因為無法找到連續空間而提前觸發下一次。
可預測停頓,這是的另一大優勢,降低停頓時間是和的共同關注點,但除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為毫秒。。。