對(duì)象引用與垃圾收集.ppt
《對(duì)象引用與垃圾收集.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《對(duì)象引用與垃圾收集.ppt(68頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
J2SE,1.4,Tigerflower2005-1,主題,對(duì)象引用與垃圾收集異常處理JAVAI/O正則表達(dá)式利用JAVA進(jìn)行XML編程嵌套式類對(duì)象的封裝與繼承抽象類與接口,垃圾收集,垃圾收集器的工作原理是識(shí)別程序中不再使用的對(duì)象,并且回收其內(nèi)存。,垃圾收集,J2SE1.4采用的代間收集策略,垃圾收集,JDK1.4的垃圾收集器復(fù)制收集器、標(biāo)記整理收集器、增量式收集器、并行復(fù)制收集器、并行清除(scavenging)收集器和并發(fā)標(biāo)記-清除收集器。,垃圾收集,其他收集選項(xiàng),垃圾收集,觀察垃圾收集運(yùn)行狀況有很多辦法來(lái)監(jiān)聽垃圾回收器的活動(dòng)??捎肵verbose:gc選項(xiàng)運(yùn)行JVM,然后觀察輸出結(jié)果一段時(shí)間。[memory]13.009-13.130:GC65536K->16788K(65536K),121.000ms,垃圾收集,微調(diào)垃圾收集選項(xiàng)最簡(jiǎn)單的垃圾收集微調(diào)就是擴(kuò)大最大堆的大?。?Xmx)。隨著堆的增大,復(fù)制收集會(huì)變得更有效,所以在增大堆時(shí),您就減少了每個(gè)對(duì)象的收集成本。除了增加最大堆的大小,還可以用選項(xiàng)-XX:NewRatio增加分配給年輕代的空間份額。也可以用-Xmn選項(xiàng)顯式指定年輕代的大小。,引用對(duì)象,從JDK1.2開引入了一個(gè)引用對(duì)象應(yīng)用程序接口API允許程序維持一個(gè)特別的到對(duì)象的引用,這樣程序能夠通過(guò)這一有限的途徑和垃圾收集器進(jìn)行交互。加入引用對(duì)象之后的引用與常規(guī)引用的區(qū)別在于,引用對(duì)象中的引用專門由內(nèi)存管理器來(lái)處理。引用對(duì)象封裝了其它一些對(duì)象的引用,我們稱之為指示對(duì)象。在引用對(duì)象創(chuàng)建的同時(shí),也就定義了該引用對(duì)象的指示對(duì)象。,Heap中的引用對(duì)象ReferenceObjects,ReferenceObjects類層次,對(duì)象的引用層次,根據(jù)對(duì)象的可獲取程度:強(qiáng)獲取、次獲取、弱獲取、虛獲取根據(jù)應(yīng)用程序要求,對(duì)象可以是強(qiáng)引用(strongreferences)、次引用(softreferences)、弱引用(weakreferences)、虛引用(phantomreferences)的任意組合。,強(qiáng)引用(strongreference),JVM內(nèi)存管理器從引用集合出發(fā)遍尋堆中所有到對(duì)象的路徑。當(dāng)?shù)竭_(dá)某對(duì)象的任意路徑都不含有引用對(duì)象時(shí),則稱該對(duì)象具有強(qiáng)獲取能力。該對(duì)象為強(qiáng)引用對(duì)象,,,,,,,,,,,Rootsetofreferences,strongreferences,,,garbage,次引用(softreference),次引用(softreference),publicclassDisplayImageextendsApplet{SoftReferencesr=null;publicvoidinit(){System.out.println("Initializing");}publicvoidpaint(Graphicsg){Imageim=(sr==null)?null:(Image)(sr.get());if(im==null){System.out.println("Fetchingimage");im=getImage(getCodeBase(),"truck1.gif");sr=newSoftReference(im);}System.out.println("Painting");g.drawImage(im,25,25,this);im=null;}publicvoidstart(){}publicvoidstop(){};}},次引用(SoftReference),所有SoftReference到的對(duì)象保證會(huì)在java虛擬機(jī)發(fā)生OutOfMemoryError前被清除。SoftReference常被用來(lái)實(shí)現(xiàn)object-cache(memory-sensitivecaches)之用的。被SoftReference指到的對(duì)象,即使沒有任何DirectReference,也不會(huì)被清除。一直要到JVM內(nèi)存不足時(shí)且沒有DirectReference時(shí)才會(huì)清除,如此一來(lái)SoftReference不但可以把對(duì)象cache起來(lái),也不會(huì)造成內(nèi)存不足的錯(cuò)誤(OutOfMemoryError)。,弱引用(weakreference),當(dāng)內(nèi)存管理器未發(fā)現(xiàn)strongreferences和softreferences時(shí),我們稱對(duì)象具有弱獲取能力,即在到達(dá)該對(duì)象的路徑中至少包含一個(gè)weakreference。,弱引用(weakreference),弱引用(weakreferences)允許用來(lái)查詢一個(gè)對(duì)象是否已被垃圾收集器回收。Imageim=(sr==null)?null:(Image)(sr.get());if(im==null){System.out.println("Fetchingimage");im=getImage(getCodeBase(),"truck1.gif");sr=newSoftReference(im);},publicclassWeakObj{publicstaticvoidmain(String[]args){try{ReferenceQueueaReferenceQueue=newReferenceQueue();ObjectanObject=newObject();WeakReferenceref=newWeakReference(anObject,aReferenceQueue);StringextraData=newString("ExtraData");HashMapaHashMap=newHashMap();aHashMap.put(ref,extraData);//(key)inaHashMapanObject=null;if(anObject==null){//ClearthestrongreferencetoextraDataextraData=null;}}catch(Exceptione){System.err.println("Anexceptionoccurred:");e.printStackTrace();}}},weakreference分析,SoftReference和WeakReference的不同在于前者是否會(huì)收集是由垃圾收集器的算法決定的,而后者是一定會(huì)被收集的。,虛引用(PhantomReference),主要是用來(lái)取代對(duì)象的finalize()和WeakReference以及SoftReference最大的不同是:PhantomReference一訂要搭配著ReferenceQueue使用,因?yàn)镻hantomReference的get()傳出值一定是null(以避免此對(duì)象不小心再度擁有DirectReference)。,Java對(duì)象引用接口應(yīng)用,1.基于Web的應(yīng)用程序常常要求顯示大量圖片,當(dāng)用戶離開某一Web頁(yè)時(shí),往往不能確定是否能夠順利的返回。在這種程序中,應(yīng)用Java對(duì)象引用API可以創(chuàng)建這樣一個(gè)環(huán)境,即當(dāng)堆內(nèi)存以最小程度運(yùn)行時(shí),內(nèi)存管理器創(chuàng)建對(duì)象。當(dāng)用戶返回時(shí),應(yīng)用程序就會(huì)重新載入已經(jīng)創(chuàng)建的圖片。,Java對(duì)象引用接口應(yīng)用,2.應(yīng)用對(duì)象引用隊(duì)列可以創(chuàng)建這樣一個(gè)環(huán)境,當(dāng)通過(guò)對(duì)象引用獲得某一對(duì)象時(shí),應(yīng)用程序得到通知。然后,應(yīng)用程序就可以對(duì)相關(guān)對(duì)象進(jìn)行清除操作,同時(shí)使這些對(duì)象在內(nèi)存管理器中合法化。,內(nèi)存泄漏,內(nèi)存泄露的本質(zhì)是無(wú)用但仍被引用的對(duì)象。僅當(dāng)一個(gè)對(duì)象不再被引用時(shí)才能被統(tǒng)計(jì)為無(wú)用的對(duì)象。垃圾收集器只能收集沒有被應(yīng)用程序引用的對(duì)象。,無(wú)用但仍被引用的對(duì)象,上面說(shuō)明了在Java應(yīng)用程序執(zhí)行期間具有不同生存周期的兩個(gè)類。類A首先被實(shí)例化,并會(huì)在很長(zhǎng)一段時(shí)間或程序的整個(gè)生存期內(nèi)存在。在某個(gè)時(shí)候,類B被創(chuàng)建,類A添加對(duì)這個(gè)新創(chuàng)建的類的一個(gè)引用?,F(xiàn)在,我們假定類B是某個(gè)用戶界面小部件,它由用戶顯示甚至解除。如果沒有清除類A對(duì)B的引用,則即便不再需要類B,并且即便在執(zhí)行下一個(gè)垃圾收集周期以后,類B仍將存在并占用內(nèi)存空間。,內(nèi)存泄漏-無(wú)意識(shí)的對(duì)象保留,publicclassStack{privateObject[]elements;privateintsize=0;publicStack(intinitialCapacity){this.elements=newObject[initialCapacity];}publicvoidpush(Objecte){ensureCapacity();elements[size++]=e;}publicObjectpop(){if(size==0)thrownewEmptyStackException();Objectresult=elements[--size];returnresult;}privatevoidensureCapacity(){if(elements.length==size){Object[]oldElements=elements;elements=newObject[2*elements.length+1];System.arraycopy(oldElements,0,elements,0,size);}}},內(nèi)存泄漏-錯(cuò)誤的局部作用域,staticStringBuffersb=newStringBuffer();publicstaticStringscopingExample(Stringstring){sb=newStringBuffer();sb.append("hello").append(string);sb.append(",nicetoseeyou!");returnsb.toString();},資源泄漏,釋放資源有一個(gè)簡(jiǎn)單的原則:如果有資源清理方法(colse、free)就及時(shí)調(diào)用。使用finally避免資源泄漏(resourceleaks)finally構(gòu)件使得某些代碼總是得以被執(zhí)行,無(wú)論是否發(fā)生異常。在維護(hù)對(duì)象內(nèi)部狀態(tài)和清理non-memory資源方面,finally尤其適用。,資源泄漏-被放棄的JDBC對(duì)象,Connectionconn=null;try{conn=getConnection();for(inti=0;i- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 對(duì)象 引用 垃圾 收集
鏈接地址:http://m.jqnhouse.com/p-11529669.html