




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第JVMGC垃圾收集梳理總結(jié)目錄什么是垃圾?什么是GC?如何發(fā)現(xiàn)垃圾?垃圾如何處理?常見的垃圾收集算法標記清除(marksweep)拷貝算法(copying)標記壓縮/標記整理(markcompact)JVM的內(nèi)存模型如何實現(xiàn)垃圾回收?分代模型
什么是垃圾?
對于程序匯總分配的內(nèi)存,當使用完成后,這部分內(nèi)存就會成為垃圾,需要對其進行釋放,否則,這部分內(nèi)存將無法被重復(fù)利用,最終造成內(nèi)存泄漏。
什么是GC?
GC是一種自動的存儲管理機制。當一些被占用的內(nèi)存不再需要時,就應(yīng)該予以釋放。這種存儲資源管理,稱為垃圾回收。
對于java而言,是自動進行垃圾回收的。
如何發(fā)現(xiàn)垃圾?
既然要實現(xiàn)垃圾的自動回收,那么第一件事就是找到垃圾,那么如何發(fā)現(xiàn)垃圾呢?其實就是判斷這個對象是否存活。
常見的兩種方式判斷:
1)引用計數(shù)法(referencecount)2)根可達性算法(rootsearching)
名稱實現(xiàn)思想優(yōu)點缺點引用計數(shù)法給每個對象添加一個引用計數(shù)器,當存在一個引用時,就加1,當一個引用失效時,就減1。判定效率高1、無法解決相互引用、循環(huán)引用的問題。2、存儲空間開銷:需要空間存儲計數(shù)器。3、時間開銷:需要處理計數(shù)器的增加和減少。根可達性算法通過一系列名為GCRoots的對象作為起始點,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈(ReferenceChain),當一個對象到GCRoots沒有任何引用鏈相連時,則證明此對象是不可用的。解決了循環(huán)引用的問題實現(xiàn)較復(fù)雜,增加了計算成本。
引用計數(shù)法(referencecount)的循環(huán)引用、相互引用:沒有外部引用,但是本身的計數(shù)器又不為0。
根可達性算法由于引用計數(shù)法存在的問題,所有主流的jvm都不使用引用計數(shù)法,而是采用根可達性算法。
如上圖,帶有GCRoots的對象表示正在被引用,而其他的對象雖然相互間有引用,但是沒有根節(jié)點,仍然會被刪除。
GCRoots對象:哪些對象可以成為GCRoots呢?jvm中主要針對堆內(nèi)的內(nèi)存進行垃圾回收,而在虛擬機棧、本地方法棧和方法區(qū)內(nèi)的對象則不會被回收,通常選擇這三個區(qū)域的對象作為GCRoots。
在jvm中主要有以下四種,在方法區(qū)存在兩種:
1)虛擬機棧中引用的對象:虛擬機棧幀中的局部變量表所引用的對象。2)本地方法棧中引用的對象:JNI(Native方法)引用的對象。3)方法區(qū)中類靜態(tài)和常量對象:靜態(tài)變量和常量引用的對象。
以下圖來展示在JVM內(nèi)存模型(JMM)的GCRoots:
在根可達性算法中,所有的引用都是強引用,下面具體分析下jvm中的四種引用。
四種引用:參考:分享JVM的四種引用方式
名稱定義特點回收強引用強引用就是引用了通過new的方式創(chuàng)建的對象。是指創(chuàng)建一個對象并把這個對象賦給一個引用變量;在root搜索算法的里面,說的引用都指的是強引用關(guān)系。GC時,永遠不會被回收,導(dǎo)致OOM的主要原因1、引用消失(比如方法執(zhí)行完)2、將引用變量設(shè)置為null軟引用如果一個對象具有軟引用,內(nèi)存空間足夠,垃圾回收器就不會回收它;如果內(nèi)存空間不足了,就會回收這些對象的內(nèi)存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存,比如網(wǎng)頁緩存、圖片緩存等。使用軟引用能防止內(nèi)存泄露,增強程序的健壯性。Java中,用SoftRefrence表示弱引用。內(nèi)存不足時(自動觸發(fā)GC),會被回收內(nèi)存不足時,觸發(fā)自動回收弱引用引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內(nèi)存是否充足,都會回收被弱引用關(guān)聯(lián)的對象。在java中,用java.lang.ref.WeakReference類來表示無論內(nèi)存是否充足,只要進行GC,都會被回收只要進行GC,都會被回收虛引用虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關(guān)聯(lián),則跟沒有引用與之關(guān)聯(lián)一樣,在任何時候都可能被垃圾回收器回收。要注意的是,虛引用必須和引用隊列關(guān)聯(lián)使用,設(shè)置虛引用關(guān)聯(lián)的唯一目的,就是在這個對象被收集器回收的時候收到一個系統(tǒng)通知或者后續(xù)添加進一步的處理。Java技術(shù)允許使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除之前做必要的清理工作。如同虛設(shè),和沒有引用沒什么區(qū)別任何時候都可能被回收
垃圾如何處理?
我們通過上面學(xué)到的根可達性算法可以發(fā)現(xiàn)垃圾的所在,那么jvm是如何進行垃圾回收的呢?通過jvm提供的垃圾收集器(GC)。
目前有以下種類的垃圾收集器,其中虛線表示垃圾收集器可以進行組合使用:
常見的垃圾收集算法
標記清除(marksweep):位置不連續(xù)產(chǎn)生碎片效率偏低(兩遍掃描)拷貝算法(copying):沒有碎片,浪費空間標記壓縮(markcompact):沒有碎片,效率偏低(兩遍掃描,指針需要調(diào)整)
標記清除(marksweep)
顧名思義,標記清除算法分為兩個階段標記(mark)和清除(sweep)。
標記:Collector從引用根結(jié)點開始遍歷,標記所有被引用的對象。一般是在對象的Header中記錄為可達對象。
清除:Collector對堆內(nèi)存從頭到尾進行線性的遍歷,如果發(fā)現(xiàn)某個對象在其Header中沒有標記為可達對象,則將其回收。
對所有能找到根節(jié)點引用的內(nèi)存空間進行標記,清除沒有找到根節(jié)點的內(nèi)存空間,其大概實現(xiàn)過程如下:
缺點:
1)STW(stoptheword),回收時,應(yīng)用掛起。2)內(nèi)存越大,效率越多,需要掃描的時間越長。3)內(nèi)存碎片化,會導(dǎo)致無法裝下新申請的對象,整體內(nèi)存是足夠的,但并非連續(xù)的。
拷貝算法(copying)
拷貝算法將內(nèi)存空間劃分為兩個區(qū)間,在任意時間點,所有動態(tài)分配的對象都只能分配在其中一個區(qū)間(稱為活動區(qū)間),而另外一個區(qū)間(稱為空閑區(qū)間)則是空閑的。
當活動區(qū)間的內(nèi)存占滿時,接下來GC線程會將活動區(qū)間內(nèi)的存活對象,全部復(fù)制到空閑區(qū)間,且嚴格按照內(nèi)存地址依次排列,與此同時,GC線程將更新存活對象的內(nèi)存引用地址指向新的內(nèi)存地址。
其大概過程如下圖所示:
缺點浪費內(nèi)存,并且存活對象越多的情況下,效率越低。
標記壓縮/標記整理(markcompact)
標記過程仍然和標記-清除一樣,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理端邊界以外的內(nèi)存。
實現(xiàn)過程大概如下:
缺點效率不高,除了要標記存活對象,還要整理存活對象的引用地址,效率低于復(fù)制算法。
總結(jié)以上三種算法都是根據(jù)根可達性算法實現(xiàn)的。當開始GC時,三種算法都會造成STW(stoptheworld)。
JVM的內(nèi)存模型如何實現(xiàn)垃圾回收?分代模型
文章前面介紹了簡單很多種垃圾收集器,不同的垃圾收集器有不同的分代模型:
1)除Epsilon、ZGC、Shenandoah之外的GC都是使用邏輯分代模型2)G1是邏輯分代,物理不分代3)除1)2)之外不僅邏輯分代,而且物理分代
分代模型:
上圖中的分代模型有些需要特別關(guān)注的點:
1)整個分代模型的組成:新生代+老年代+永久代(jdk1.7)/元空間(jdk1.8)永久代、元空間:Class永久代:必須指定大小限制元空間:可以設(shè)置大小,也可以不設(shè)置,無上限(受限于物理內(nèi)存)字符串常量池:jdk1.7-永久代,jdk1.8-堆MethodArea(方法區(qū))邏輯概念:永久代、元數(shù)據(jù)2)新生代:Eden+2個suvivor區(qū)YGC回收之后,大多數(shù)的對象會被回收,活著的進入s0再次YGC,活著的對象eden+s0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外出授課試講管理辦法
- 辦公修舊利廢管理辦法
- 500KV輸電線路鐵塔斜柱斜面施工詳解
- 崗山窯文化遺產(chǎn)活化促進地方農(nóng)業(yè)產(chǎn)業(yè)發(fā)展模式探索
- 民警十二分制管理辦法
- 樓宇智能化PLC控制系統(tǒng)的設(shè)計與實現(xiàn)
- 生物多樣性保護與恢復(fù)機制-洞察及研究
- 泥漿不落地安全施工方案
- 安全工器具定期檢查
- 四川省安全生產(chǎn)事故應(yīng)急預(yù)案管理辦法
- 2022年劍河縣事業(yè)單位考試真題及答案
- 電氣控制與PLC應(yīng)用技術(shù)(三菱機型)高教版YL-235A送料機構(gòu)控制電路的連接與編程教學(xué)案例高教版
- GB/T 5163-2006燒結(jié)金屬材料(不包括硬質(zhì)合金)可滲性燒結(jié)金屬材料密度、含油率和開孔率的測定
- GB/T 17989.2-2020控制圖第2部分:常規(guī)控制圖
- 建設(shè)項目安全設(shè)施‘三同時’課件
- 2022語文課程標準:“語言文字積累與梳理”任務(wù)群解讀及實操
- DB15T 489-2019 石油化學(xué)工業(yè)建設(shè)工程技術(shù)資料管理規(guī)范
- 內(nèi)蒙古自治區(qū)通遼市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 螺旋溜槽安裝標準工藝
- 2022年人教版六年級下冊語文期末考試卷
- 《土地開發(fā)整理項目預(yù)算編制暫行辦法》
評論
0/150
提交評論