一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

論文:從JVM的內存管理角度分析Java的GC垃圾回收機制

時(shí)間:2024-09-25 11:50:45 管理畢業(yè)論文 我要投稿
  • 相關(guān)推薦

論文:從JVM的內存管理角度分析Java的GC垃圾回收機制

  一個(gè)優(yōu)秀的Java程序員必須了解GC的工作原理、如何優(yōu)化GC的性能、如何與GC進(jìn)行有限的交互,因為有一些應用程序對性能要求較高,例如嵌入式系統、實(shí)時(shí)系統等,只有全面提升內存的管理效率 ,才能提高整個(gè)應用程序的性能。本篇文章首先簡(jiǎn)單介紹GC的工作原理之后,然后再對GC的幾個(gè)關(guān)鍵問(wèn)題進(jìn)行深入探討,最后提出一些Java程序設計建議,從GC角度提高Java程序的性能。

論文:從JVM的內存管理角度分析Java的GC垃圾回收機制

  GC的基本原理

  Java的內存管理實(shí)際上就是對象的管理,其中包括對象的分配和釋放。

  對于程序員來(lái)說(shuō),分配對象使用new關(guān)鍵字;釋放對象時(shí),只要將對象所有引用賦值為null,讓程序不能夠再訪(fǎng)問(wèn)到這個(gè)對象,我們稱(chēng)該對象為"不可達的".GC將負責回收所有"不可達"對象的內存空間。

  對于GC來(lái)說(shuō),當程序員創(chuàng )建對象時(shí),GC就開(kāi)始監控這個(gè)對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象(詳見(jiàn) 參考資料1 )。通過(guò)這種方式確定哪些對象是"可達的",哪些對象是"不可達的".當GC確定一些對象為"不可達"時(shí),GC就有責任回收這些內存空間。但是,為了保證GC能夠在不同平臺實(shí)現的問(wèn)題,Java規范對GC的很多行為都沒(méi)有進(jìn)行嚴格的規定。例如,對于采用什么類(lèi)型的回收算法、什么時(shí)候進(jìn)行回收等重要問(wèn)題都沒(méi)有明確的規定。因此,不同的JVM的實(shí)現者往往有不同的實(shí)現算法。這也給Java程序員的開(kāi)發(fā)帶來(lái)行多不確定性。本文研究了幾個(gè)與GC工作相關(guān)的問(wèn)題,努力減少這種不確定性給Java程序帶來(lái)的負面影響。

  增量式GC( Incremental GC )

  GC在JVM中通常是由一個(gè)或一組進(jìn)程來(lái)實(shí)現的,它本身也和用戶(hù)程序一樣占用heap空間,運行時(shí)也占用CPU.當GC進(jìn)程運行時(shí),應用程序停止運行。因此,當GC運行時(shí)間較長(cháng)時(shí),用戶(hù)能夠感到Java程序的停頓,另外一方面,如果GC運行時(shí)間太短,則可能對象回收率太低,這意味著(zhù)還有很多應該回收的對象沒(méi)有被回收,仍然占用大量?jì)却。因此,在設計GC的時(shí)候,就必須在停頓時(shí)間和回收率之間進(jìn)行權衡。一個(gè)好的GC實(shí)現允許用戶(hù)定義自己所需要的設置,例如有些內存有限有設備,對內存的使用量非常敏感,希望GC能夠準確的回收內存,它并不在意程序速度的放慢。另外一些實(shí)時(shí)網(wǎng)絡(luò )游戲,就不能夠允許程序有長(cháng)時(shí)間的中斷。增量式GC就是通過(guò)一定的回收算法,把一個(gè)長(cháng)時(shí)間的中斷,劃分為很多個(gè)小的中斷,通過(guò)這種方式減少GC對用戶(hù)程序的影響。雖然,增量式GC在整體性能上可能不如普通GC的效率高,但是它能夠減少程序的最長(cháng)停頓時(shí)間。

  Sun JDK提供的HotSpot JVM就能支持增量式GC.HotSpot JVM缺省GC方式為不使用增量GC,為了啟動(dòng)增量GC,我們必須在運行Java程序時(shí)增加-Xincgc的參數。HotSpot JVM增量式GC的實(shí)現是采用Train GC算法。它的基本想法就是,將堆中的所有對象按照創(chuàng )建和使用情況進(jìn)行分組(分層),將使用頻繁高和具有相關(guān)性的對象放在一隊中,隨著(zhù)程序的運行,不斷對組進(jìn)行調整。當GC運行時(shí),它總是先回收最老的(最近很少訪(fǎng)問(wèn)的)的對象,如果整組都為可回收對象,GC將整組回收。這樣,每次GC運行只回收一定比例的不可達對象,保證程序的順暢運行。

  詳解finalize函數

  finalize是位于Object類(lèi)的一個(gè)方法,該方法的訪(fǎng)問(wèn)修飾符為protected,由于所有類(lèi)為Object的子類(lèi),因此用戶(hù)類(lèi)很容易訪(fǎng)問(wèn)到這個(gè)方法。由于,finalize函數沒(méi)有自動(dòng)實(shí)現鏈式調用,我們必須手動(dòng)的實(shí)現,因此finalize函數的最后一個(gè)語(yǔ)句通常是super.finalize()。通過(guò)這種方式,我們可以實(shí)現從下到上實(shí)現finalize的調用,即先釋放自己的資源,然后再釋放父類(lèi)的資源。

  根據Java語(yǔ)言規范,JVM保證調用finalize函數之前,這個(gè)對象是不可達的,但是JVM不保證這個(gè)函數一定會(huì )被調用。另外,規范還保證finalize函數最多運行一次。

  很多Java初學(xué)者會(huì )認為這個(gè)方法類(lèi)似與C++中的析構函數,將很多對象、資源的釋放都放在這一函數里面。其實(shí),這不是一種很好的方式。原因有三,其一,GC為了能夠支持finalize函數,要對覆蓋這個(gè)函數的對象作很多附加的工作。其二,在finalize運行完成之后,該對象可能變成可達的,GC還要再檢查一次該對象是否是可達的。因此,使用finalize會(huì )降低GC的運行性能。其三,由于GC調用finalize的時(shí)間是不確定的,因此通過(guò)這種方式釋放資源也是不確定的。

  通常,finalize用于一些不容易控制、并且非常重要資源的釋放,例如一些I/O的操作,數據的連接。這些資源的釋放對整個(gè)應用程序是非常關(guān)鍵的。在這種情況下,程序員應該以通過(guò)程序本身管理(包括釋放)這些資源為主,以finalize函數釋放資源方式為輔,形成一種雙保險的管理機制,而不應該僅僅依靠finalize來(lái)釋放資源。

  下面給出一個(gè)例子說(shuō)明,finalize函數被調用以后,仍然可能是可達的,同時(shí)也可說(shuō)明一個(gè)對象的finalize只可能運行一次。

  class MyObject{ Test main; //記錄Test對象,在finalize中時(shí)用于恢復可達性 public MyObject(Test t) { main=t; //保存Test 對象 } protected void finalize() { main.ref=this;// 恢復本對象,讓本對象可達 System.out.println("This is finalize");//用于測試finalize只運行一次 } } class Test { MyObject ref; public static void main(String[] args) { Test test=new Test(); test.ref=new MyObject(test); test.ref=null; //MyObject對象為不可達對象,finalize將被調用 System.gc(); if (test.ref!=null) System.out.println("My Object還活著(zhù)"); } }

  運行結果:

  This is finalize

  MyObject還活著(zhù)

  此例子中,需要注意的是雖然MyObject對象在finalize中變成可達對象,但是下次回收時(shí)候,finalize卻不再被調用,因為finalize函數最多只調用一次。

  程序如何與GC進(jìn)行交互

  Java2增強了內存管理功能, 增加了一個(gè)java.lang.ref包,其中定義了三種引用類(lèi)。這三種引用類(lèi)分別為SoftReference、WeakReference和PhantomReference.通過(guò)使用這些引用類(lèi),程序員可以在一定程度與GC進(jìn)行交互,以便改善GC的工作效率。這些引用類(lèi)的引用強度介于可達對象和不可達對象之間。

  創(chuàng )建一個(gè)引用對象也非常容易,例如如果你需要創(chuàng )建一個(gè)Soft Reference對象,那么首先創(chuàng )建一個(gè)對象,并采用普通引用方式(可達對象);然后再創(chuàng )建一個(gè)SoftReference引用該對象;最后將普通引用設置為null.通過(guò)這種方式,這個(gè)對象就只有一個(gè)Soft Reference引用。同時(shí),我們稱(chēng)這個(gè)對象為Soft Reference 對象。

  Soft Reference的主要特點(diǎn)是據有較強的引用功能。只有當內存不夠的時(shí)候,才進(jìn)行回收這類(lèi)內存,因此在內存足夠的時(shí)候,它們通常不被回收。另外,這些引用對象還能保證在Java拋出OutOfMemory 異常之前,被設置為null.它可以用于實(shí)現一些常用圖片的緩存,實(shí)現Cache的功能,保證最大限度的使用內存而不引起OutOfMemory.以下給出這種引用類(lèi)型的使用偽代碼;

  //申請一個(gè)圖像對象Image image=new Image();//創(chuàng )建Image對象…//使用 image…//使用完了image,將它設置為soft 引用類(lèi)型,并且釋放強引用;SoftReference sr=new SoftReference(image);image=null; … //下次使用時(shí) if (sr!=null) image=sr.get(); else{ //由于GC由于低內存,已釋放image,因此需要重新裝載; image=new Image();sr=new SoftReference(image);}

  Weak引用對象與Soft引用對象的最大不同就在于:GC在進(jìn)行回收時(shí),需要通過(guò)算法檢查是否回收Soft引用對象,而對于Weak引用對象,GC總是進(jìn)行回收。Weak引用對象更容易、更快被GC回收。雖然,GC在運行時(shí)一定回收Weak對象,但是復雜關(guān)系的Weak對象群常常需要好幾次GC的運行才能完成。Weak引用對象常常用于Map結構中,引用數據量較大的對象,一旦該對象的強引用為null時(shí),GC能夠快速地回收該對象空間。

  Phantom引用的用途較少,主要用于輔助finalize函數的使用。Phantom對象指一些對象,它們執行完了finalize函數,并為不可達對象,但是它們還沒(méi)有被GC回收。這種對象可以輔助finalize進(jìn)行一些后期的回收工作,我們通過(guò)覆蓋Reference的clear()方法,增強資源回收機制的靈活性。

  一些Java編碼的建議

  根據GC的工作原理,我們可以通過(guò)一些技巧和方式,讓GC運行更加有效率,更加符合應用程序的要求。以下就是一些程序設計的幾點(diǎn)建議。

  1.最基本的建議就是盡早釋放無(wú)用對象的引用。大多數程序員在使用臨時(shí)變量的時(shí)候,都是讓引用變量在退出活動(dòng)域(scope)后,自動(dòng)設置為null.我們在使用這種方式時(shí)候,必須特別注意一些復雜的對象圖,例如數組,隊列,樹(shù),圖等,這些對象之間有相互引用關(guān)系較為復雜。對于這類(lèi)對象,GC回收它們一般效率較低。如果程序允許,盡早將不用的引用對象賦為null.這樣可以加速GC的工作。 [Page]

  2.盡量少用finalize函數。finalize函數是Java提供給程序員一個(gè)釋放對象或資源的機會(huì )。但是,它會(huì )加大GC的工作量,因此盡量少采用finalize方式回收資源。

  3.如果需要使用經(jīng)常使用的圖片,可以使用soft應用類(lèi)型。它可以盡可能將圖片保存在內存中,供程序調用,而不引起OutOfMemory.

  4.注意集合數據類(lèi)型,包括數組,樹(shù),圖,鏈表等數據結構,這些數據結構對GC來(lái)說(shuō),回收更為復雜。另外,注意一些全局的變量,以及一些靜態(tài)變量。這些變量往往容易引起懸掛對象(dangling reference),造成內存浪費。

  5.當程序有一定的等待時(shí)間,程序員可以手動(dòng)執行System.gc(),通知GC運行,但是Java語(yǔ)言規范并不保證GC一定會(huì )執行。使用增量式GC可以縮短Java程序的暫停時(shí)間。

【論文:從JVM的內存管理角度分析Java的GC垃圾回收機制】相關(guān)文章:

淺談應急管理后勤保障及應對機制分析論文05-27

質(zhì)量管理的激勵機制論文12-02

對高職學(xué)校德育管理機制的探討及分析03-18

方針管理的預算管理分析論文12-02

農業(yè)項目投入機制和資金管理研究論文11-13

建筑施工管理下的協(xié)調管理分析的論文11-26

酒店管理教學(xué)法分析論文11-29

水利施工企業(yè)項目管理分析論文11-21

作業(yè)成本法管理動(dòng)因分析論文03-03

電子檔案信息安全管理分析論文02-15

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看