對象引用與垃圾收集.ppt
《對象引用與垃圾收集.ppt》由會員分享,可在線閱讀,更多相關《對象引用與垃圾收集.ppt(68頁珍藏版)》請在裝配圖網(wǎng)上搜索。
J2SE,1.4,Tigerflower2005-1,主題,對象引用與垃圾收集異常處理JAVAI/O正則表達式利用JAVA進行XML編程嵌套式類對象的封裝與繼承抽象類與接口,垃圾收集,垃圾收集器的工作原理是識別程序中不再使用的對象,并且回收其內(nèi)存。,垃圾收集,J2SE1.4采用的代間收集策略,垃圾收集,JDK1.4的垃圾收集器復制收集器、標記整理收集器、增量式收集器、并行復制收集器、并行清除(scavenging)收集器和并發(fā)標記-清除收集器。,垃圾收集,其他收集選項,垃圾收集,觀察垃圾收集運行狀況有很多辦法來監(jiān)聽垃圾回收器的活動??捎肵verbose:gc選項運行JVM,然后觀察輸出結果一段時間。[memory]13.009-13.130:GC65536K->16788K(65536K),121.000ms,垃圾收集,微調(diào)垃圾收集選項最簡單的垃圾收集微調(diào)就是擴大最大堆的大?。?Xmx)。隨著堆的增大,復制收集會變得更有效,所以在增大堆時,您就減少了每個對象的收集成本。除了增加最大堆的大小,還可以用選項-XX:NewRatio增加分配給年輕代的空間份額。也可以用-Xmn選項顯式指定年輕代的大小。,引用對象,從JDK1.2開引入了一個引用對象應用程序接口API允許程序維持一個特別的到對象的引用,這樣程序能夠通過這一有限的途徑和垃圾收集器進行交互。加入引用對象之后的引用與常規(guī)引用的區(qū)別在于,引用對象中的引用專門由內(nèi)存管理器來處理。引用對象封裝了其它一些對象的引用,我們稱之為指示對象。在引用對象創(chuàng)建的同時,也就定義了該引用對象的指示對象。,Heap中的引用對象ReferenceObjects,ReferenceObjects類層次,對象的引用層次,根據(jù)對象的可獲取程度:強獲取、次獲取、弱獲取、虛獲取根據(jù)應用程序要求,對象可以是強引用(strongreferences)、次引用(softreferences)、弱引用(weakreferences)、虛引用(phantomreferences)的任意組合。,強引用(strongreference),JVM內(nèi)存管理器從引用集合出發(fā)遍尋堆中所有到對象的路徑。當?shù)竭_某對象的任意路徑都不含有引用對象時,則稱該對象具有強獲取能力。該對象為強引用對象,,,,,,,,,,,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到的對象保證會在java虛擬機發(fā)生OutOfMemoryError前被清除。SoftReference常被用來實現(xiàn)object-cache(memory-sensitivecaches)之用的。被SoftReference指到的對象,即使沒有任何DirectReference,也不會被清除。一直要到JVM內(nèi)存不足時且沒有DirectReference時才會清除,如此一來SoftReference不但可以把對象cache起來,也不會造成內(nèi)存不足的錯誤(OutOfMemoryError)。,弱引用(weakreference),當內(nèi)存管理器未發(fā)現(xiàn)strongreferences和softreferences時,我們稱對象具有弱獲取能力,即在到達該對象的路徑中至少包含一個weakreference。,弱引用(weakreference),弱引用(weakreferences)允許用來查詢一個對象是否已被垃圾收集器回收。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的不同在于前者是否會收集是由垃圾收集器的算法決定的,而后者是一定會被收集的。,虛引用(PhantomReference),主要是用來取代對象的finalize()和WeakReference以及SoftReference最大的不同是:PhantomReference一訂要搭配著ReferenceQueue使用,因為PhantomReference的get()傳出值一定是null(以避免此對象不小心再度擁有DirectReference)。,Java對象引用接口應用,1.基于Web的應用程序常常要求顯示大量圖片,當用戶離開某一Web頁時,往往不能確定是否能夠順利的返回。在這種程序中,應用Java對象引用API可以創(chuàng)建這樣一個環(huán)境,即當堆內(nèi)存以最小程度運行時,內(nèi)存管理器創(chuàng)建對象。當用戶返回時,應用程序就會重新載入已經(jīng)創(chuàng)建的圖片。,Java對象引用接口應用,2.應用對象引用隊列可以創(chuàng)建這樣一個環(huán)境,當通過對象引用獲得某一對象時,應用程序得到通知。然后,應用程序就可以對相關對象進行清除操作,同時使這些對象在內(nèi)存管理器中合法化。,內(nèi)存泄漏,內(nèi)存泄露的本質(zhì)是無用但仍被引用的對象。僅當一個對象不再被引用時才能被統(tǒng)計為無用的對象。垃圾收集器只能收集沒有被應用程序引用的對象。,無用但仍被引用的對象,上面說明了在Java應用程序執(zhí)行期間具有不同生存周期的兩個類。類A首先被實例化,并會在很長一段時間或程序的整個生存期內(nèi)存在。在某個時候,類B被創(chuàng)建,類A添加對這個新創(chuàng)建的類的一個引用?,F(xiàn)在,我們假定類B是某個用戶界面小部件,它由用戶顯示甚至解除。如果沒有清除類A對B的引用,則即便不再需要類B,并且即便在執(zhí)行下一個垃圾收集周期以后,類B仍將存在并占用內(nèi)存空間。,內(nèi)存泄漏-無意識的對象保留,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)存泄漏-錯誤的局部作用域,staticStringBuffersb=newStringBuffer();publicstaticStringscopingExample(Stringstring){sb=newStringBuffer();sb.append("hello").append(string);sb.append(",nicetoseeyou!");returnsb.toString();},資源泄漏,釋放資源有一個簡單的原則:如果有資源清理方法(colse、free)就及時調(diào)用。使用finally避免資源泄漏(resourceleaks)finally構件使得某些代碼總是得以被執(zhí)行,無論是否發(fā)生異常。在維護對象內(nèi)部狀態(tài)和清理non-memory資源方面,finally尤其適用。,資源泄漏-被放棄的JDBC對象,Connectionconn=null;try{conn=getConnection();for(inti=0;i- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 對象 引用 垃圾 收集
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.jqnhouse.com/p-11529669.html