<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    JVM分代垃圾回收策略的基礎概念

     由于不同對象的生命周期不一樣,因此在JVM的垃圾回收策略中有分代這一策略。本文介紹了分代策略的目標,如何分代,以及垃圾回收的觸發因素。

      文章總結了JVM垃圾回收策略為什么要分代,如何分代,以及垃圾回收的觸發因素。

      為什么要分代

      分代的垃圾回收策略,是基于這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。

      在Java程序運行的過程中,會產生大量的對象,其中有些對象是與業務信息相關,比如Http請求中的Session對象、線程、Socket連接,這類對象跟業務直接掛鉤,因此生命周期比較長。但是還有一些對象,主要是程序運行過程中生成的臨時變量,這些對象生命周期會比較短,比如:String對象,由于其不變類的特性,系統會產生大量的這些對象,有些對象甚至只用一次即可回收。

      試想,在不進行對象存活時間區分的情況下,每次垃圾回收都是對整個堆空間進行回收,花費時間相對會長,同時,因為每次回收都需要遍歷所有存活對象,但實際上,對于生命周期長的對象而言,這種遍歷是沒有效果的,因為可能進行了很多次遍歷,但是他們依舊存在。因此,分代垃圾回收采用分治的思想,進行代的劃分,把不同生命周期的對象放在不同代上,不同代上采用最適合它的垃圾回收方式進行回收。

      如何分代

      如圖所示:

      如何分代

      虛擬機中的共劃分為三個代:年輕代(Young Generation)、年老點(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。

      年輕代:

      所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(一般而言)。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區復制過來的并且此時還存活的對象,將被復制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先后關系,所以同一個區中可能同時存在從Eden復制過來 對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空的。同時,根據程序需要,Survivor區是可以配置為多個的(多于兩個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。

     年老代:

      在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。

      持久代:

      用于存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=<N>進行設置。

      什么情況下觸發垃圾回收

      由于對象進行了分代處理,因此垃圾回收區域、時間也不一樣。GC有兩種類型:Scavenge GC和Full GC。

      Scavenge GC

      一般情況下,當新對象生成,并且在Eden申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區。然后整理Survivor的兩個區。這種方式的GC是對年輕代的Eden區進行,不會影響到年老代。因為大部分對象都是從Eden區開始的,同時Eden區不會分配的很大,所以Eden區的GC會頻繁進行。因而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。

      對整個堆進行整理,包括Young、Tenured和Perm。Full GC因為需要對整個對進行回收,所以比Scavenge GC要慢,因此應該盡可能減少Full GC的次數。在對JVM調優的過程中,很大一部分工作就是對于FullGC的調節。有如下原因可能導致Full GC:

      ◆ 年老代(Tenured)被寫滿

      ◆ 持久代(Perm)被寫滿

      ◆ System.gc()被顯示調用

      ◆ 上一次GC之后Heap的各域分配策略動態變化


    posted on 2011-12-14 15:24 順其自然EVO 閱讀(192) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久精品a一国产成人免费网站| 中文字幕无码一区二区免费| 成人毛片18女人毛片免费视频未| 久久亚洲私人国产精品| a级毛片黄免费a级毛片| 在线观看亚洲av每日更新| 一区二区三区免费视频播放器| 免费涩涩在线视频网| 亚洲熟妇无码一区二区三区| 午夜国产精品免费观看| 亚洲一区二区三区免费在线观看 | 国产精品亚洲а∨无码播放麻豆 | 亚洲国产精品综合久久20| 一本岛高清v不卡免费一三区| 亚洲免费人成视频观看| 操美女视频免费网站| 国产成人亚洲综合a∨| 亚洲国产成人久久综合野外| 国产精品免费视频观看拍拍| 亚洲AV永久精品爱情岛论坛| 在线免费中文字幕| 亚洲五月丁香综合视频| 在线观看亚洲免费视频| 久久成人18免费网站| 精品日韩亚洲AV无码 | 国产免费爽爽视频免费可以看| 立即播放免费毛片一级| 亚洲熟妇无码另类久久久| 三年片在线观看免费观看大全一| 亚洲成a人片在线观看中文!!!| 成人免费毛片观看| a级毛片免费观看网站| 亚洲爆乳精品无码一区二区三区| 最近中文字幕2019高清免费| 亚洲精品天堂成人片AV在线播放| 亚洲高清最新av网站| 中文字幕免费视频一| 女bbbbxxxx另类亚洲| 亚洲AV福利天堂一区二区三| 成年女性特黄午夜视频免费看| 国产伦精品一区二区免费|