深入jvm內(nèi)核原理診斷與優(yōu)化4gc算法種類_第1頁(yè)
深入jvm內(nèi)核原理診斷與優(yōu)化4gc算法種類_第2頁(yè)
深入jvm內(nèi)核原理診斷與優(yōu)化4gc算法種類_第3頁(yè)
深入jvm內(nèi)核原理診斷與優(yōu)化4gc算法種類_第4頁(yè)
深入jvm內(nèi)核原理診斷與優(yōu)化4gc算法種類_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

深入JVM內(nèi)核——原理、診斷與優(yōu)化第4周法律聲明【聲明】本視頻和幻燈片為煉數(shù)成金網(wǎng)絡(luò)課程的教學(xué)資料,所有資料只能在課程內(nèi)使用,不得在課程以外范圍散播,違者將可能被追究法律和經(jīng)濟(jì)責(zé)任。課程詳情訪問(wèn)煉數(shù)成金培訓(xùn)網(wǎng)站GC算法與種類GC的概念GC算法引用計(jì)數(shù)法標(biāo)記清除標(biāo)記壓縮復(fù)制算法可觸及性Stop-The-WorldGC的概念GarbageCollection垃圾收集1960年List使用了GCJava中,GC的對(duì)象是堆空間和永久區(qū)引用計(jì)數(shù)法老牌垃圾回收算法通過(guò)引用計(jì)算來(lái)回收垃圾使用者COMActionScript3Python引用計(jì)數(shù)法引用計(jì)數(shù)器的實(shí)現(xiàn)很簡(jiǎn)單,對(duì)于一個(gè)對(duì)象A,只要有任何一個(gè)對(duì)象引用了A,則A的引用計(jì)數(shù)器就加1,當(dāng)引用失效時(shí),引用計(jì)數(shù)器就減1。只要對(duì)象A的引用計(jì)數(shù)器的值為0,則對(duì)象A就不可能再被使用。根對(duì)象可達(dá)的有效對(duì)象根對(duì)象可達(dá)的有效對(duì)象根對(duì)象可達(dá)的有效對(duì)象引用計(jì)數(shù)法引用計(jì)數(shù)法的問(wèn)題引用和去引用伴隨加法和減法,影響性能很難處理循環(huán)引用根對(duì)象可達(dá)的有效對(duì)象2根對(duì)象可達(dá)的有效對(duì)象根對(duì)象可達(dá)的有效對(duì)象1標(biāo)記-清除標(biāo)記-清除算法是現(xiàn)代垃圾回收算法的思想基礎(chǔ)。標(biāo)記-清除算法將垃圾回收分為兩個(gè)階段:標(biāo)記階段和清除階段。一種可行的實(shí)現(xiàn)是,在標(biāo)記階段,首先通過(guò)根節(jié)點(diǎn),標(biāo)記所有從根節(jié)點(diǎn)開(kāi)始的可達(dá)對(duì)象。因此,未被標(biāo)記的對(duì)象就是未被引用的垃圾對(duì)象。然后,在清除階段,清除所有未被標(biāo)記的對(duì)象。標(biāo)記-清除空閑空間垃圾對(duì)象存活對(duì)象根節(jié)點(diǎn)根節(jié)點(diǎn)標(biāo)記-壓縮標(biāo)記-壓縮算法適合用于存活對(duì)象較多的場(chǎng)合,如老年代。它在標(biāo)記-清除算法的基礎(chǔ)上做了一些優(yōu)化。和標(biāo)記-清除算法一樣,標(biāo)記-壓縮算法也首先需要從根節(jié)點(diǎn)開(kāi)始,對(duì)所有可達(dá)對(duì)象做一次標(biāo)記。但之后,它并不簡(jiǎn)單的清理未標(biāo)記的對(duì)象,而是將所有的存活對(duì)象壓縮到內(nèi)存的一端。之后,清理邊界外所有的空間。標(biāo)記-壓縮空閑空間垃圾對(duì)象存活對(duì)象標(biāo)記-壓縮標(biāo)記壓縮對(duì)標(biāo)記清除而言,有什么優(yōu)勢(shì)呢?復(fù)制算法與標(biāo)記-清除算法相比,復(fù)制算法是一種相對(duì)高效的回收方法不適用于存活對(duì)象較多的場(chǎng)合如老年代將原有的內(nèi)存空間分為兩塊,每次只使用其中一塊,在垃圾回收時(shí),將正在使用的內(nèi)存中的存活對(duì)象復(fù)制到未使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對(duì)象,交換兩個(gè)內(nèi)存的角色,完成垃圾回收復(fù)制算法空閑空間垃圾對(duì)象存活對(duì)象兩塊空間完全相同,每次只用一塊復(fù)制算法復(fù)制算法的最大問(wèn)題是:空間浪費(fèi)整合標(biāo)記清理思想老年代大對(duì)象空閑空間垃圾對(duì)象存活對(duì)象老年代大對(duì)象復(fù)制算法-XX:+PrintGCDetails的輸出Heapdefnewgenerationtotal13824K,used11223K[0x27e80000,0x28d80000,0x28d80000)edenspace12288K,91%used[0x27e80000,0x28975f20,0x28a80000)fromspace1536K,0%used[0x28a80000,0x28a80000,0x28c00000)tospace1536K,0%used[0x28c00000,0x28c00000,0x28d80000)tenuredgenerationtotal5120K,used0K[0x28d80000,0x29280000,0x34680000)thespace5120K,0%used[0x28d80000,0x28d80000,0x28d80200,0x29280000)compactingpermgentotal12288K,used142K[0x34680000,0x35280000,0x38680000)thespace12288K,1%used[0x34680000,0x346a3a90,0x346a3c00,0x35280000)rospace10240K,44%used[0x38680000,0x38af73f0,0x38af7400,0x39080000)rwspace12288K,52%used[0x39080000,0x396cdd28,0x396cde00,0x39c80000)12288K+1536K(0x28d80000-0x27e80000)/1024/1024=15M分代思想依據(jù)對(duì)象的存活周期進(jìn)行分類,短命對(duì)象歸為新生代,長(zhǎng)命對(duì)象歸為老年代。根據(jù)不同代的特點(diǎn),選取合適的收集算法少量對(duì)象存活,適合復(fù)制算法大量對(duì)象存活,適合標(biāo)記清理或者標(biāo)記壓縮GC算法總結(jié)整理引用計(jì)數(shù)沒(méi)有被Java采用標(biāo)記-清除標(biāo)記-壓縮復(fù)制算法新生代所有的算法,需要能夠識(shí)別一個(gè)垃圾對(duì)象,因此需要給出一個(gè)可觸及性的定義?標(biāo)記-壓縮比標(biāo)記-清除有何優(yōu)勢(shì)可觸及性可觸及的從根節(jié)點(diǎn)可以觸及到這個(gè)對(duì)象可復(fù)活的一旦所有引用被釋放,就是可復(fù)活狀態(tài)因?yàn)樵趂inalize()中可能復(fù)活該對(duì)象不可觸及的在finalize()后,可能會(huì)進(jìn)入不可觸及狀態(tài)不可觸及的對(duì)象不可能復(fù)活可以回收可觸及性publicclassCanReliveObj{ publicstaticCanReliveObjobj; @Override protectedvoidfinalize()throwsThrowable{ super.finalize(); System.out.println("CanReliveObjfinalizecalled");

obj=this; } @Override publicStringtoString(){ return"IamCanReliveObj"; }publicstaticvoidmain(String[]args)throwsInterruptedException{obj=newCanReliveObj();obj=null;//可復(fù)活System.gc();Thread.sleep(1000);if(obj==null){System.out.println("obj是null");}else{System.out.println("obj可用");}System.out.println("第二次gc");obj=null;//不可復(fù)活System.gc();Thread.sleep(1000);if(obj==null){System.out.println("obj是null");}else{System.out.println("obj可用");}}}CanReliveObjfinalizecalledobj可用第二次gcobj是null可觸及性經(jīng)驗(yàn):避免使用finalize(),操作不慎可能導(dǎo)致錯(cuò)誤。優(yōu)先級(jí)低,何時(shí)被調(diào)用,不確定何時(shí)發(fā)生GC不確定可以使用try-catch-finally來(lái)替代它可觸及性根棧中引用的對(duì)象方法區(qū)中靜態(tài)成員或者常量引用的對(duì)象(全局對(duì)象)JNI方法棧中引用對(duì)象Stop-The-WorldStop-The-WorldJava中一種全局暫停的現(xiàn)象全局停頓,所有Java代碼停止,native代碼可以執(zhí)行,但不能和JVM交互多半由于GC引起Dump線程死鎖檢查堆DumpStop-The-WorldGC時(shí)為什么會(huì)有全局停頓?類比在聚會(huì)時(shí)打掃房間,聚會(huì)時(shí)很亂,又有新的垃圾產(chǎn)生,房間永遠(yuǎn)打掃不干凈,只有讓大家停止活動(dòng)了,才能將房間打掃干凈。危害長(zhǎng)時(shí)間服務(wù)停止,沒(méi)有響應(yīng)遇到HA系統(tǒng),可能引起主備切換,嚴(yán)重危害生產(chǎn)環(huán)境。主機(jī)備機(jī)主機(jī)備機(jī)主機(jī)Stop-The-WorldpublicstaticclassPrintThreadextendsThread{ publicstaticfinallongstarttime=System.currentTimeMillis(); @Override publicvoidrun(){ try{ while(true){ longt=System.currentTimeMillis()-starttime; System.out.println("time:"+t); Thread.sleep(100); } }catch(Exceptione){

} }}每秒打印10條Stop-The-WorldpublicstaticclassMyThreadextendsThread{ HashMap<Long,byte[]>map=newHashMap<Long,byte[]>(); @Override publicvoidrun(){ try{ while(true){ if(map.size()*512/1024/1024>=450){ System.out.println(“=====準(zhǔn)備清理=====:"+map.size()); map.clear(); }

for(inti=0;i<1024;i++){ map.put(System.nanoTime(),newbyte[512]); } Thread.sleep(1); } }catch(Exceptione){ e.printStackTrace(); } }}工作線程,消耗內(nèi)存大于450M時(shí),清理內(nèi)存-Xmx512M-Xms512M-XX:+UseSerialGC-Xloggc:gc.log-XX:+PrintGCDetails-Xmn1m-XX:PretenureSizeThreshold=50-XX:MaxTenuringThreshold=1Stop-The-World預(yù)期,應(yīng)該是每秒中有10條輸出time:2018time:2121time:2221time:2325time:2425time:2527time:2631time:2731time:2834time:2935time:3035time:3153time:3504time:4218======beforecleanmap=======:921765time:4349time:4450time:45513.292:[GC3.292:[DefNew:959K->63K(960K),0.0024260secs]523578K->523298K(524224K),0.0024879secs][Times:user=0.02sys=0.00,real=0.00secs]3.296:[GC3.296:[DefNew:959K->959K(960K),0.0000123secs]3.296:[Tenured:523235K->523263K(523264K),0.2820915secs]524195K->523870K(524224K),[Perm:147K->147K(12288K)],0.2821730secs][Times:user=0.26sys=0.00,real=0.28secs]3.579:[FullGC3.579:[Tenured:523263K->523263K(523264K),0.2846036secs]524159K->524042K(524224K),[Perm:147K->147K(12288K)],0.2846745secs][Times:user=0.28sys=0.00,real=0.28secs]3.863:[FullGC3.863:[Tenured:523263K->515818K(523264K),0.4282780secs]524042K->515818K(524224K),[Perm:147K->147K(12288K)],0.4283353secs][Times:user=0.42sys=0.00,real=0.43secs]4.293:[GC4.293:[DefNew:896K->64K(960K),0.0017584secs]516716K->516554K(524224K),0.0018346secs][Times:user

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論