posts - 10,comments - 2,trackbacks - 0
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          積分與排名

          • 積分 - 19034
          • 排名 - 1786

          最新評論

          閱讀排行榜

          評論排行榜

          1、引用計數(shù)(reference counting)
              原理:此對象有一個引用,則+1;刪除一個引用,則-1。只用收集計數(shù)為0的對象。
              
          缺點:無法處理循環(huán)引用的問題。如:
          對象A和B分別有字段b、a,令A(yù).b=B和B.a=A,除此之外這2個對象再無任何引用,那實際上這2個對象已經(jīng)不可能再被訪問,但是引用計數(shù)算法卻無法回收他們。 

          2、復(fù)制(copying)
              原理:把內(nèi)存空間劃分為2個相等的區(qū)域,每次只使用一個區(qū)域。垃圾回收時,遍歷當(dāng)前使用區(qū)域,把正在使用的對象復(fù)制到另外一個區(qū)域。
              優(yōu)點:不會出現(xiàn)碎片問題。
              缺點:1、暫停整個應(yīng)用。2、需要2倍的內(nèi)存空間。

          3、
          標(biāo)記-清掃(Mark-and-sweep)---sun前期版本就是用這個技術(shù)。
              原理:對于“活”的對象,一定可以追溯到其存活在堆棧、靜態(tài)存儲區(qū)之中的引用。這個引用鏈條可能會穿過數(shù)個對象層次。第一階段:從GC roots開始遍歷所有的引用,對有活的對象進(jìn)行標(biāo)記。第二階段:對堆進(jìn)行遍歷,把未標(biāo)記的對象進(jìn)行清除。這個解決了循環(huán)引用的問題。
              缺點:1、暫停整個應(yīng)用;2、會產(chǎn)生內(nèi)存碎片。

          4、
          標(biāo)記-壓縮(Mark-Compact)自適應(yīng)
              原理:第一階段標(biāo)記活的對象,第二階段把為標(biāo)記的對象壓縮到堆的其中一塊,按順序放。
              優(yōu)點:1、避免標(biāo)記掃描的碎片問題;2、避免停止復(fù)制的空間問題。
              
              
          具體使用什么方法GC,Java虛擬機(jī)會進(jìn)行監(jiān)視,如果所有對象都很穩(wěn)定,垃圾回收器的效率低的話,就切換到“標(biāo)記-掃描”方式;同樣,Java虛擬機(jī)會跟蹤“標(biāo)記-掃描”的效果,要是堆空間碎片出現(xiàn)很多碎片,就會切換回“停止-復(fù)制”模式。這就是自適應(yīng)的技術(shù)。

          5、分代(generational collecting)
          -----J2SE1.2以后使用此算法
              原理:基于對象生命周期分析得出的垃圾回收算法。把對象分為年輕代、年老代、持久代,對不同的生命周期使用不同的算法(2-3方法中的一個即4自適應(yīng))進(jìn)行回收。


          如上圖所示:為Java的各代分布圖
          年輕代(young)
              分為3個區(qū)。一個Eden區(qū),2個survivor區(qū)。大部分對象在Eden中生成。當(dāng)Eden區(qū)滿時,還存活的對象將被復(fù)制到survivor區(qū)。當(dāng)該survivor區(qū)滿時,此區(qū)的存活對象被復(fù)制到另外一個survivor區(qū),當(dāng)?shù)?個survivor區(qū)也滿時,該區(qū)還存活的對象將被復(fù)制到年老區(qū)(tenured)。

          年老代(tenured)
             存放從年輕代(young)復(fù)制過來的對象。

          持久代(perm)
              用于存放靜態(tài)文件,如Java類、方法等。持久代對垃圾回收沒有顯著的影響,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class。持久代大小通過
          -XX:MaxPermSize=N進(jìn)行設(shè)置

          Thinking in java給java gc取了一個羅嗦的稱呼:“自適應(yīng)、分代的、停止-復(fù)制、標(biāo)記-掃描”式的垃圾回收器。

          導(dǎo)致Gc的情況:
          1、tenured被寫滿
          2、perm被寫滿
          3、System.gc()的顯式調(diào)用。
          4、上一次GC之后heap的各域分配策略動態(tài)變化。
          posted on 2011-07-21 00:45 showsun 閱讀(4531) 評論(1)  編輯  收藏 所屬分類: J2SE

          FeedBack:
          # re: Java GC基本算法
          主站蜘蛛池模板: 江华| 西昌市| 南宫市| 南丹县| 永平县| 平昌县| 凌海市| 留坝县| 海安县| 吉木乃县| 玛曲县| 泰宁县| 贵州省| 奇台县| 渭源县| 石棉县| 伊川县| 泰兴市| 临猗县| 玉龙| 泸州市| 名山县| 许昌市| 怀来县| 乌拉特后旗| 吐鲁番市| 阿合奇县| 封开县| 门头沟区| 聂荣县| 伊金霍洛旗| 西安市| 永泰县| 岑巩县| 碌曲县| 藁城市| 德惠市| 青浦区| 揭阳市| 巴塘县| 湄潭县|