欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      優(yōu)秀的Java程序員必須了解的GC工作原理(5篇范文)

      時(shí)間:2019-05-12 11:56:38下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《優(yōu)秀的Java程序員必須了解的GC工作原理》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《優(yōu)秀的Java程序員必須了解的GC工作原理》。

      第一篇:優(yōu)秀的Java程序員必須了解的GC工作原理

      優(yōu)秀的Java程序員必須了解GC的工作原理

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

      GC的基本原理

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

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

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

      增量式GC(Incremental GC)

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

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

      詳解finalize函數(shù)

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

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

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

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

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

      class MyObject{

      Test main;//記錄Test對(duì)象,在finalize中時(shí)用于恢復(fù)可達(dá)性

      public MyObject(Test t)

      {

      main=t;//保存Test 對(duì)象

      }

      protected void finalize()

      {

      main.ref=this;// 恢復(fù)本對(duì)象,讓本對(duì)象可達(dá)

      System.out.println(/“This is finalize/”);//用于測(cè)試finalize只運(yùn)行一次

      }

      }

      class Test {

      MyObject ref;

      public static void main(String[] args){

      Test test=new Test();

      test.ref=new MyObject(test);

      test.ref=null;//MyObject對(duì)象為不可達(dá)對(duì)象,finalize將被調(diào)用

      System.gc();

      if(test.ref!=null)System.out.println(/“My Object還活著/”);

      }

      }

      運(yùn)行結(jié)果:

      This is finalize

      MyObject還活著

      此例子中,需要注意的是雖然MyObject對(duì)象在finalize中變成可達(dá)對(duì)象,但是下次回收時(shí)候,finalize卻不再被調(diào)用,因?yàn)閒inalize函數(shù)最多只調(diào)用一次。

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

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

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

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

      出這種引用類(lèi)型的使用偽代碼;

      //申請(qǐng)一個(gè)圖像對(duì)象

      Image image=new Image();//創(chuàng)建Image對(duì)象

      //使用 image

      //使用完了image,將它設(shè)置為soft 引用類(lèi)型,并且釋放強(qiáng)引用;

      SoftReference sr=new SoftReference(image);

      image=null;

      //下次使用時(shí)

      if(sr!=null)image=sr.get();

      else{

      //由于GC由于低內(nèi)存,已釋放image,因此需要重新裝載;

      image=new Image();

      sr=new SoftReference(image);

      }

      Weak引用對(duì)象與Soft引用對(duì)象的最大不同就在于:GC在進(jìn)行回收時(shí),需要通過(guò)算法檢查是否回收Soft引用對(duì)象,而對(duì)于Weak引用對(duì)象,GC總是進(jìn)行回收。Weak引用對(duì)象更容易、更快被GC回收。雖然,GC在運(yùn)行時(shí)一定回收Weak對(duì)象,但是復(fù)雜關(guān)系的Weak對(duì)象群常常需要好幾

      第二篇:優(yōu)秀Java程序員必須了解的GC工作原理[最終版]

      優(yōu)秀Java程序員必須了解的GC工作原理

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

      GC的基本原理

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

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

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

      增量式GC(Incremental GC)

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

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

      詳解finalize函數(shù)

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

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

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

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

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

      class MyObject{ Test main;//記錄Test對(duì)象,在finalize中時(shí)用于恢復(fù)可達(dá)性 public MyObject(Test t){ main=t;//保存Test 對(duì)象 } protected void finalize(){ main.ref=this;// 恢復(fù)本對(duì)象,讓本對(duì)象可達(dá)

      System.out.println(“This is finalize”);//用于測(cè)試finalize只運(yùn)行一次 } } class Test { MyObject ref;public static void main(String[] args){ Test test=new Test();test.ref=new MyObject(test);test.ref=null;//MyObject對(duì)象為不可達(dá)對(duì)象,finalize將被調(diào)用 System.gc();if(test.ref!=null)System.out.println(“My Object還活著”);} } 運(yùn)行結(jié)果: This is finalize MyObject還活著

      此例子中,需要注意的是雖然MyObject對(duì)象在finalize中變成可達(dá)對(duì)象,但是下次回收時(shí)候,finalize卻不再被調(diào)用,因?yàn)閒inalize函數(shù)最多只調(diào)用一次。

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

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

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

      //申請(qǐng)一個(gè)圖像對(duì)象

      Image image=new Image();//創(chuàng)建Image對(duì)象 …

      //使用 image …

      //使用完了image,將它設(shè)置為soft 引用類(lèi)型,并且釋放強(qiáng)引用; SoftReference sr=new SoftReference(image);image=null;…

      //下次使用時(shí)

      if(sr!=null)image=sr.get();else{ //由于GC由于低內(nèi)存,已釋放image,因此需要重新裝載; image=new Image();sr=new SoftReference(image);}

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

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

      一些Java編碼的建議

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

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

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

      3.如果需要使用經(jīng)常使用的圖片,可以使用soft應(yīng)用類(lèi)型。它可以盡可能將圖片保存在內(nèi)存中,供程序調(diào)用,而不引起OutOfMemory.4.注意集合數(shù)據(jù)類(lèi)型,包括數(shù)組,樹(shù),圖,鏈表等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對(duì)GC來(lái)說(shuō),回收更為復(fù)雜。另外,注意一些全局的變量,以及一些靜態(tài)變量。這些變量往往容易引起懸掛對(duì)象(dangling reference),造成內(nèi)存浪費(fèi)。

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

      第三篇:優(yōu)秀的java程序員必須掌握的十項(xiàng)技能

      西安尚學(xué)堂

      一個(gè)優(yōu)秀的Java程序員必須掌握的10項(xiàng)技能

      3G時(shí)代迫使IT從業(yè)者中的技術(shù)人員掌握越來(lái)越多的實(shí)用技能,作為IT行業(yè)的技術(shù)創(chuàng)造者,一個(gè)優(yōu)秀的java程序員必須掌握以下的10項(xiàng)技能,方能勝任java程序員的崗位。

      1、語(yǔ)法:必須比較熟悉,在寫(xiě)代碼的時(shí)候的編輯器對(duì)某一行報(bào)錯(cuò)應(yīng)該能夠根據(jù)報(bào)錯(cuò)信息知道是什么樣的語(yǔ)法錯(cuò)誤并且知道如何修正。

      2、命令:必須熟悉自帶的常用命令及其常用選項(xiàng),需要熟悉的命令:appletviewer、Htmlonverter、jar、java、javac、javadoc、javap、javaw、native2ascii、serialver,如果這些命令你沒(méi)有全部使用過(guò),那么你對(duì)java實(shí)際上還很不了解。

      3、工具:必須至少熟練使用一種IDE的開(kāi)發(fā)工具,例如、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括進(jìn)行工程管理、常用選項(xiàng)的設(shè)置、插件的安裝配置以及進(jìn)行調(diào)試。

      4、API:的核心API是非常龐大的,但是有一些內(nèi)容筆者認(rèn)為是必須熟悉的,否則不可能熟練的運(yùn)用Java,包括:

      ◆java.lang包下的80%以上的類(lèi)的功能的靈活運(yùn)用。

      ◆java.util包下的80%以上的類(lèi)的靈活運(yùn)用,特別是集合類(lèi)體系、規(guī)則表達(dá)式、zip、以及時(shí)間、隨機(jī)數(shù)、屬性、資源和Timer.◆java.io包下的60%以上的類(lèi)的使用,理解IO體系的基于管道模型的設(shè)計(jì)思路以及常用IO類(lèi)的特性和使用場(chǎng)合。

      ◆java.math包下的100%的內(nèi)容。

      ◆java.net包下的60%以上的內(nèi)容,對(duì)各個(gè)類(lèi)的功能比較熟悉。

      ◆java.text包下的60%以上的內(nèi)容,特別是各種格式化類(lèi)。

      ◆熟練運(yùn)用JDBC.8)、java.security包下40%以上的內(nèi)容,如果對(duì)于安全沒(méi)有接觸的話根本就不可能掌握java.◆AWT的基本內(nèi)容,包括各種組件事件、監(jiān)聽(tīng)器、布局管理器、常用組件、打印?!鬝wing的基本內(nèi)容,和AWT的要求類(lèi)似。

      ◆XML處理,熟悉SAX、DOM以及JDOM的優(yōu)缺點(diǎn)并且能夠使用其中的一種完成XML的解析及內(nèi)容處理。

      5、測(cè)試:必須熟悉使用junit編寫(xiě)測(cè)試用例完成代碼的自動(dòng)測(cè)試。

      6、管理:必須熟悉使用ant完成工程管理的常用任務(wù),例如工程編譯、生成javadoc、生成jar、版本控制、自動(dòng)測(cè)試。

      7、排錯(cuò):應(yīng)該可以根據(jù)信息比較快速的定位問(wèn)題的原因和大致位置。

      8、思想:必須掌握OOP的主要要求,這樣使用Java開(kāi)發(fā)的系統(tǒng)才能是真正的Java系統(tǒng)。

      9、規(guī)范:編寫(xiě)的代碼必須符合流行的編碼規(guī)范,例如類(lèi)名首字母大寫(xiě),成員和方法名首字母小寫(xiě),方法名的第一個(gè)單詞一般是動(dòng)詞,包名全部小寫(xiě)等,這樣程序的可讀性才比較好。

      10、博學(xué):掌握、Oracle、WebLogic、Jboss、、Struts、Hibernate 等流行技術(shù),掌握軟件架構(gòu)設(shè)計(jì)思想、搜索引擎優(yōu)化、緩存系統(tǒng)設(shè)計(jì)、網(wǎng)站負(fù)載均衡、系統(tǒng)性能調(diào)優(yōu)等實(shí)用技術(shù)。

      第四篇:Java程序員必須掌握的開(kāi)發(fā)工具

      Java程序員必須掌握的開(kāi)發(fā)工具

      以下的開(kāi)發(fā)工具,能幫助你成為一名高級(jí)java程序開(kāi)發(fā)人員。

      1.Eclipse

      盡管IntelliJ IDEA、NetBeans和一些其他的IDE正在日益普及,但是有調(diào)查表明,Eclipse仍然是幾乎半數(shù)Java開(kāi)發(fā)人員首選的開(kāi)發(fā)環(huán)境。Eclipse是IDE領(lǐng)域的瑞士軍刀,有著大量定制的接口和無(wú)數(shù)的插件。它無(wú)處不在,后面本文將推薦的其他所有工具都提供Eclipse插件。這也是八維必講的開(kāi)發(fā)工具。

      Eclipse的工作流程可分為三個(gè)方面:工作臺(tái),工作空間和視角。工作臺(tái)作為到IDE的出發(fā)點(diǎn)。工作空間將項(xiàng)目、文件和配置設(shè)置組合在一個(gè)單獨(dú)的 目錄下。視角定義工具、視圖和有效設(shè)置。雖然新手開(kāi)發(fā)人員可能會(huì)覺(jué)得相比Netbeans和IntelliJ IDEA,Eclipse使用起來(lái)更難,但Eclipse的靈活性,使其成為企業(yè)開(kāi)發(fā)的首選IDE。

      Luna,Eclipse的最新版本,支持Java

      8、分屏編輯、新的黑色主題,以及一個(gè)功能齊全的命令行終端。

      2.Gradle

      Gradle是一個(gè)自動(dòng)化項(xiàng)目工具,建立在Apache Maven和Apache Ant的功能上。雖然Gradle并不是最流行的構(gòu)建工具(最流行的是Maven,64%的Java開(kāi)發(fā)人員會(huì)選擇它),但它的普及速度很快。它也可作為默認(rèn)的Android構(gòu)建工具。

      Gradle引以為傲的是它的簡(jiǎn)單。Gradle使用Groovy編程語(yǔ)言,與Maven和Ant使用XML語(yǔ)法截然相反。

      3.Javadoc

      Javadoc是Oracle提供的文檔生成器。它可以將特殊格式的注釋解析為HTML文檔。

      Javadoc注釋使用開(kāi)放標(biāo)簽、關(guān)閉標(biāo)簽,以及一個(gè)或多個(gè)描述性標(biāo)簽的格式。開(kāi)放式標(biāo)簽類(lèi)似于標(biāo)準(zhǔn)Java多行注釋標(biāo)記,使用兩個(gè)星號(hào)的除外。Javadoc也解析普通的HTML標(biāo)簽。

      Javadoc自動(dòng)格式化標(biāo)簽和關(guān)鍵字,除非另有規(guī)定。Javadoc廣泛使用超鏈接,允許你參考和鏈接到代碼的不同區(qū)域。許多IDE--包括 Eclipse--可以自動(dòng)添加Javadoc注釋模塊到變量、類(lèi)和方法中。支持Maven、Gradle和Ant的插件在編譯代碼的同時(shí)也可以構(gòu)建 Javadoc HTML。

      4.JUnit

      JUnit是用于編寫(xiě)和運(yùn)行單元測(cè)試的開(kāi)源框架。一個(gè)基本的JUnit測(cè)試包括測(cè)試類(lèi)、測(cè)試方法、以及執(zhí)行測(cè)試的功能。JUnit使用標(biāo)注來(lái)確定測(cè)試如何構(gòu)造和運(yùn)行。例如,如果你的程序有一個(gè)類(lèi)叫做MathClass,具有乘法和除法的方法,你可以創(chuàng)建JUnit測(cè)試來(lái)檢 查不符合預(yù)期的值。輸入數(shù)字2和5到乘法方法,你希望得到的結(jié)果為10。當(dāng)輸入0作為除法方法的第二個(gè)參數(shù)時(shí),你會(huì)期望給出一個(gè)數(shù)字計(jì)算異常的警告因?yàn)槌?數(shù)不能為0:

      @Test標(biāo)注規(guī)定,MathClass方法是一個(gè)測(cè)試用例。在JUnit提供額外的標(biāo)注,比如@Before,這樣你就可以在測(cè)試運(yùn)行之前設(shè)置環(huán)境。JUnit還可以設(shè)置規(guī)則用于定義測(cè)試方法的行為。例如,TemporaryFolder規(guī)則使得一旦測(cè)試完成,由測(cè)試創(chuàng)建的文件或文件夾就會(huì)被刪除。

      5.Cobertura

      Cobertura可用于分析Java代碼的測(cè)試覆蓋率。Cobertura根據(jù)沒(méi)有被測(cè)試覆蓋的代碼生成基于HTML的報(bào)告。

      Cobertura提供可用于插裝、檢查和測(cè)試代碼的工具。通過(guò)監(jiān)控可測(cè)試的代碼,Cobertura允許你使用你選擇的測(cè)試框架,甚至不需要測(cè)試框架就可以運(yùn)行程序。

      Cobertura根據(jù)行、分支和程序包三個(gè)方面給出代碼覆蓋報(bào)告。每個(gè)類(lèi)別都有一個(gè)可自定義的閾值,如果覆蓋面低于閾值,就會(huì)觸發(fā)警告。Cobertura還集成了Maven和Gradle 的自動(dòng)檢測(cè)功能。

      6.FindBugs

      FindBugs是一個(gè)匹配編譯代碼模式,而非使用bug數(shù)據(jù)庫(kù)的工具。當(dāng)提供源代碼時(shí),F(xiàn)indBugs還可高亮顯示檢測(cè)出bug的代碼行。

      在它的3.0.1版本中,F(xiàn)indBugs繼續(xù)保持著數(shù)以百計(jì)的bug描述。根據(jù)bug的嚴(yán)重程度,F(xiàn)indBugs將bug分為四個(gè)水平:相關(guān) 的,令人困擾的,可怕的,以及最可怕的。除了圖形用戶(hù)界面,F(xiàn)indBugs還提供一個(gè)命令行界面,Ant任務(wù),以及Eclipse插件。

      7.VisualVM

      包含在JDK中的VisualVM是監(jiān)控和審查Java應(yīng)用程序性能的工具。VisualVM檢測(cè)并重視活躍的JVM實(shí)例來(lái)檢索有關(guān)進(jìn)程的診斷信息。

      VisualVM可以很容易地實(shí)時(shí)診斷性能問(wèn)題。它提供了全套的分析工具,包括JConsole、jstack、jmap、jinfo和jstat等。此外,你還可以對(duì)JVM做一個(gè)快照,這樣以后在任何時(shí)都能審查。

      8.Groovy

      Groovy是一種編程語(yǔ)言,通過(guò)添加新的關(guān)鍵字,自動(dòng)導(dǎo)入常用的類(lèi),以及可選類(lèi)型變量聲明,既簡(jiǎn)化又?jǐn)U展了Java。

      Groovy的核心優(yōu)勢(shì)之一是它的腳本功能。類(lèi)可以被編譯為Java字節(jié)碼或使用Groovy Shell動(dòng)態(tài)執(zhí)行。Groovy的Java基礎(chǔ)使得它相較于Jython和JRuby更容易為Java開(kāi)發(fā)人員所接受。

      第五篇:Java程序員需要了解的8個(gè)Java開(kāi)發(fā)工具

      Java程序員需要了解的8個(gè)Java開(kāi)發(fā)工具

      Java是計(jì)算機(jī)應(yīng)用程序編程語(yǔ)言,被廣泛用于創(chuàng)建Web應(yīng)用、服務(wù)器處理、用戶(hù)端的API開(kāi)發(fā)乃至數(shù)據(jù)庫(kù)等多個(gè)領(lǐng)域。下面厚學(xué)網(wǎng)小編列出了8個(gè)有助于你開(kāi)發(fā)Java應(yīng)用程序好的Java工具。

      1.SparkJava 這是一款體形輕巧,功能強(qiáng)大的Web應(yīng)用框架。Spark擁有簡(jiǎn)單而直接的方法。您可以通過(guò)一些繁瑣的XML配置來(lái)使用Spark框架編寫(xiě)應(yīng)用程序。Spark能讓你花費(fèi)很少的精力來(lái)開(kāi)發(fā)Java的Web應(yīng)用程序。

      2.jClarity jClarity是兩款產(chǎn)品的結(jié)合:illuminate用于性能監(jiān)控,而census則可以收集日志和分析數(shù)據(jù)。jClarity支持云集成,并且其框架緊湊輕巧。

      3.Clover Clover是用于代碼覆蓋的一大利器。該工具有助于用于應(yīng)用程序測(cè)試的代碼。我們可以在IDE或持續(xù)集成系統(tǒng)中運(yùn)行Clover。該工具能讓測(cè)試的運(yùn)行速度更快。

      4.JProfiler JProfiler擁有直觀的用戶(hù)界面,可以幫助你解決性能瓶頸和理解問(wèn)題。JProfiler能讓你輕松約束內(nèi)存泄漏和修復(fù)線程的問(wèn)題。

      5.VisualVM VisualVM是一個(gè)集多功能于一身的Java故障排除工具。你可以使用VisualVM整合多命令行JDK工具。此輕便的工具有著驚人的分析能力。你可以在各種技術(shù),如jvmstat、JMX和Serviceability Agent(SA)中使用VisualVM。VisualVM出名的是附加了API,以獲得更多的數(shù)據(jù),以及自動(dòng)使用更快捷。

      6.Elasticsearch Elasticsearch提供了可以整合現(xiàn)有的應(yīng)用程序來(lái)驅(qū)動(dòng)其與輸入數(shù)據(jù)的交互的工具。這款開(kāi)源工具提供了實(shí)時(shí)搜索和分析引擎。Elasticsearch可用于可靠性和可擴(kuò)展性作為重要因素的分布式環(huán)境。該工具提供了超簡(jiǎn)單的全文搜索體驗(yàn)。

      7.Sonarqube

      Sonarqube是一個(gè)用來(lái)管理代碼質(zhì)量的開(kāi)放式平臺(tái)?;赪eb的應(yīng)用程序可以與Java應(yīng)用程序進(jìn)行配置。它提供了規(guī)則、警報(bào)、閾值、排除和設(shè)置功能。SonarQube允許用戶(hù)將指標(biāo)結(jié)合在一起,以及使用歷史的措施混合。

      8.Takipi Takipi是一個(gè)輕量級(jí)的Java代理。Takipi安裝方便,用不了幾分鐘就可以搞定。它對(duì)代碼注釋或配置并沒(méi)有要求。你可以使用一臺(tái)具有完全功能的服務(wù)器與Takipi工作。此款 Java工具能幫助你減少調(diào)試時(shí)間。

      總結(jié)

      對(duì)于想學(xué)習(xí)Java的朋友來(lái)說(shuō),比較快的方式當(dāng)然是結(jié)合自身實(shí)際情況找一家專(zhuān)業(yè)的培訓(xùn)機(jī)構(gòu)來(lái)進(jìn)行系統(tǒng)有效的學(xué)習(xí),對(duì)此,小編推薦您可以訪問(wèn)厚學(xué)網(wǎng)(004km.cn)來(lái)了解各大知名培訓(xùn)機(jī)構(gòu)的詳細(xì)情況,為自己的選擇保駕護(hù)航;目前厚學(xué)網(wǎng)共計(jì)入駐了多家IT領(lǐng)域的知名培訓(xùn)機(jī)構(gòu),如:被北大青鳥(niǎo)、達(dá)內(nèi)、上海藍(lán)鷗、閣瑞鈦倫特軟件培訓(xùn)等,在讓客戶(hù)了解全面的課程信息及真實(shí)用戶(hù)評(píng)價(jià)的同時(shí),也讓客戶(hù)能夠更放心,省心的選擇到想學(xué)的課程,希望小編的傾力推薦能夠?qū)δ倪x擇有所幫助,期待您早日學(xué)有所成,加油!

      下載優(yōu)秀的Java程序員必須了解的GC工作原理(5篇范文)word格式文檔
      下載優(yōu)秀的Java程序員必須了解的GC工作原理(5篇范文).doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        java程序員必須知道的八大排序

        Java程序員必知的8大排序 2012-06-28 14:01 without0815 博客園 我要評(píng)論(0) 字號(hào):T | T 本文主要詳解了Java語(yǔ)言的8大排序的基本思想以及實(shí)例解讀,詳細(xì)請(qǐng)看下文 AD: 51CTO云計(jì)......

        java程序員情詩(shī)(優(yōu)秀范文5篇)

        IT民工都是上輩子折翼的天使呀 一、初級(jí)版 我能抽象出整個(gè)世界... 但是我卻不能抽象出你... 你肯定是一個(gè)單例,因?yàn)槟闶悄菢拥莫?dú)一無(wú)二... 所以我的世界并不完整... 我可以重載甚至覆......

        如何走上優(yōu)秀Java程序員之路?

        004km.cn 如何走上優(yōu)秀Java程序員之路? 或許每一個(gè)人都有一個(gè)高薪夢(mèng),Java程序員也不例外,高薪的前提是具備高薪的能力。本文就為大家介紹如何從一名普通碼農(nóng)進(jìn)階成優(yōu)......

        如何成為優(yōu)秀的Java程序員

        如何成為優(yōu)秀的Java程序員 每一個(gè)優(yōu)秀的人在做事的時(shí)候都有自己的做事風(fēng)格,那么那些優(yōu)秀的Java程序員的編程風(fēng)格如何呢?下面我們具體講講,希望對(duì)想學(xué)習(xí)或正在學(xué)習(xí)編程的同學(xué)有......

        JAVA程序員求職信(優(yōu)秀范文五篇)

        尊敬的領(lǐng)導(dǎo):您好!十分感謝您在百忙之中能翻閱我的自薦信。與公司是一種選擇,與我則是一種機(jī)會(huì)。在上千份大同小異的求職信中,我期望你手中的這份能給您帶來(lái)驚喜!我叫張XX,是xx技......

        Java程序員必須掌握的線程知識(shí)(精選五篇)

        Java程序員必須掌握的線程知識(shí) Callable和Future Callable和Future出現(xiàn)的原因 創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實(shí)現(xiàn)Runnable接口。 這2種方式都有一個(gè)缺......

        Java程序員需要了解的幾個(gè)開(kāi)源協(xié)議介紹(5篇)

        Java程序員需要了解的幾個(gè)開(kāi)源協(xié)議介紹.txt這是一個(gè)禁忌相繼崩潰的時(shí)代,沒(méi)人攔得著你,只有你自己攔著自己,你的禁忌越多成就就越少。自卑有多種檔次,最高檔次的自卑表現(xiàn)為吹噓自......

        如何修煉成優(yōu)秀Java開(kāi)發(fā)程序員?(合集)

        004km.cn 如何修煉成優(yōu)秀Java開(kāi)發(fā)程序員? 在求職旺季,面對(duì)新的工作,你磨刀霍霍,投了簡(jiǎn)歷,馬上要去面試的時(shí)候卻又慫了,面試官會(huì)問(wèn)我哪些問(wèn)題呢?萬(wàn)一他問(wèn)的我答不上來(lái)怎......