人在江湖

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          年輕代:

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

          年老代:

              在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代中。因此,可以認(rèn)為年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。

          持久代:

              用于存放靜態(tài)文件,如今Java類、方法等。持久代對(duì)垃圾回收沒(méi)有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class,例如Hibernate 等,在這種時(shí)候需要設(shè)置一個(gè)比較大的持久代空間來(lái)存放這些運(yùn)行過(guò)程中新增的類。持久代大小通過(guò)-XX:MaxPermSize=<N>進(jìn)行設(shè) 置。

          什么情況下觸發(fā)垃圾回收

          由于對(duì)象進(jìn)行了分代處理,因此垃圾回收區(qū)域、時(shí)間也不一樣。GC有兩種類型:Scavenge GCFull GC

          Scavenge GC

                一般情況下,當(dāng)新對(duì)象生成,并且在Eden申請(qǐng)空間失敗時(shí),就會(huì)觸發(fā)Scavenge GC,對(duì)Eden區(qū)域進(jìn)行GC,清除非存活對(duì)象,并且把尚且存活的對(duì)象移動(dòng)到Survivor區(qū)。然后整理Survivor的兩個(gè)區(qū)。這種方式的GC是對(duì) 年輕代的Eden區(qū)進(jìn)行,不會(huì)影響到年老代。因?yàn)榇蟛糠謱?duì)象都是從Eden區(qū)開(kāi)始的,同時(shí)Eden區(qū)不會(huì)分配的很大,所以Eden區(qū)的GC會(huì)頻繁進(jìn)行。因 而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來(lái)。

          Full GC

                對(duì)整個(gè)堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC因?yàn)樾枰獙?duì)整個(gè)對(duì)進(jìn)行回收,所以比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC的次數(shù)。在對(duì)JVM調(diào)優(yōu)的過(guò)程中,很大一部分工作就是對(duì)于FullGC的調(diào)節(jié)。有如下原因可能導(dǎo)致Full GC:

                年老代(Tenured)被寫滿

                持久代(Perm)被寫滿

                System.gc()被顯示調(diào)用

               上一次GC之后Heap的各域分配策略動(dòng)態(tài)變化

          串行處理器:

          --適用情況:數(shù)據(jù)量比較小(100M左右);單處理器下并且對(duì)響應(yīng)時(shí)間無(wú)要求的應(yīng)用。
          --缺點(diǎn):只能用于小型應(yīng)用

          并行處理器:

          --適用情況:“對(duì)吞吐量有高要求”,多CPU、對(duì)應(yīng)用響應(yīng)時(shí)間無(wú)要求的中、大型應(yīng)用。舉例:后臺(tái)處理、科學(xué)計(jì)算。
          --缺點(diǎn):垃圾收集過(guò)程中應(yīng)用響應(yīng)時(shí)間可能加長(zhǎng)

          并發(fā)處理器:

          --適用情況:“對(duì)響應(yīng)時(shí)間有高要求”,多CPU、對(duì)應(yīng)用響應(yīng)時(shí)間有較高要求的中、大型應(yīng)用。舉例:Web服務(wù)器/應(yīng)用服務(wù)器、電信交換、集成開(kāi)發(fā)環(huán)境。

          ===================================

          今天使用jmap和jhat試圖解決permgen out of memory的問(wèn)題,找到了一個(gè)很好的文章:

          http://blogs.sun.com/fkieviet/entry/how_to_fix_the_dreaded

          貼個(gè)開(kāi)頭,防止原帖丟了,連google的線索都沒(méi)有

          How to fix the dreaded "java.lang.OutOfMemoryError: PermGen space" exception (classloader leaks)

          In the previous blog entry Classloader leaks: the dreaded "java.lang.OutOfMemoryError: PermGen space" exception  I explained how this type of problem can originate in the application code that you deploy to an application server.  In this post I'll explain how to track down the leak so that you can fix it.

          Profilers
          Memory leak? Use a profiler. Right? Well... generally speaking the answer is yes, but classloader leaks are a bit special...

          posted on 2011-01-30 18:12 人在江湖 閱讀(430) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 孟村| 自治县| 牡丹江市| 武隆县| 宜宾市| 霍城县| 满城县| 安乡县| 桐梓县| 沾化县| 新邵县| 永嘉县| 克山县| 托里县| 博兴县| 方山县| 潮安县| 抚顺县| 鄄城县| 桃园县| 肇东市| 日喀则市| 金坛市| 安康市| 无为县| 施甸县| 临潭县| 丰镇市| 鄂托克旗| 兰溪市| 永福县| 施甸县| 新和县| 安塞县| 色达县| 从化市| 宜都市| 象山县| 报价| 离岛区| 九龙县|