資源描述:
《jvm調(diào)優(yōu)總結(jié)(4):分代垃圾回收-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JVM調(diào)優(yōu)總結(jié)(4):分代垃圾回收-編程開發(fā)技術(shù)JVM調(diào)優(yōu)總結(jié)(4):分代垃圾回收原文出處:pengjiaheng為什么要分代分代的垃圾回收策略,是基于這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。在Java程序運行的過程屮,會產(chǎn)生大量的對象,其屮有些對象是與業(yè)務(wù)信息相關(guān),比如Http請求中的Session對象、線程、Socket連接,這類對象跟業(yè)務(wù)直接掛鉤,因此生命周期比較長。但是還有一些對象,主耍是程序運行過程中生成的臨時變量,這些對象生命周期會比較短,比如:String對象,
2、由于其不變類的特性,系統(tǒng)會產(chǎn)生大量的這些對彖,有些對彖甚至只用一次即可冋收。試想,在不進行對象存活吋間區(qū)分的情況下,每次垃圾冋收都是對整個堆空間進行回收,花費時間相對會長,同吋,因為每次回收都需要遍歷所冇存活對象,但實際上,對于生命周期長的對象而言,這種遍歷是沒有效果的,因為可能進行了很多次遍丿力,但是他們依舊存在。因此,分代垃圾回收采用分治的思想,進行代的劃分,把不同生命周期的對象放在不同代上,不同代上采用最適合它的垃圾冋收方式進行回收。如何分代如圖所示:虛擬機中的共劃分為三個代:年輕代(YoungGeneration)、年老點(OldGene
3、ration)和持久代(PermanentGeneration)。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關(guān)系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。年輕代:所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區(qū)。一個Eden區(qū),兩個Survivor區(qū)(—般而言)。大部分對象在Eden區(qū)中生成。當Eden區(qū)滿時,還存活的對象將被復制到Survivor區(qū)(兩個中的一個),當這個Survivor區(qū)滿時,此區(qū)的存活對象將被復制到另外一個Survivor區(qū),
4、當這個Survivor去也滿了的時候,從第一個Survivor區(qū)復制過來的并口此時還存活的對象,將被復制“年老區(qū)(Tenured)n。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系,所以同一個區(qū)中可能同時存在從Eden復制過來對象,和從詢一個Survivor復制過來的對象,而復制到年老區(qū)的只有從第一個Survivor去過來的對象。而且,Survivor區(qū)總冇一個是空的。同時,根據(jù)程序需要,Survivor區(qū)是可以配置為多個的(多于兩個),這樣可以增加對彖在年輕代中的存在時間,減少被放到年老代的可能。年老代:在年輕代中經(jīng)歷了N次垃圾回收后仍
5、然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。持久代:用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate等,在這種時候需要設(shè)置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPcrmSize=進行設(shè)置。什么情況下觸發(fā)垃圾回收由于對彖進行了分代處理,因此垃圾冋收區(qū)域、時間也不一樣。GC有兩種類型:ScavengeGC和FullGC。ScavengeGC一般情況卜,當新對象生成,
6、并且在Eden屮請空間失敗時,就會觸發(fā)ScavengeGC,對Eden區(qū)域進行GC,清除非存活對象,并月.把尚月?存活的對象移動到SurvivorIX0然后整理Survivor的兩個區(qū)。這種方式的GC是對年輕代的Eden區(qū)進行,不會影響到年老代。因為大部分對象都是從Eden區(qū)開始的,同吋Eden區(qū)不會分配的很大,所以Eden區(qū)的GC會頻繁進行。因而,一般在這里需要使用速度快、效率高的算法,使Eden去能盡快空閑出來。FullGC對整個堆進行整理,包括Young.Tenured和Perm。FullGC因為需要對整個對進行回收,所以比Scavenge
7、GC要慢,因此應該盡可能減少FullGC的次數(shù)。在對JVM調(diào)優(yōu)的過程屮,很大一部分工作就是對于FullGC的調(diào)節(jié)。冇如下原因可能導致FullGC:?年老代(Tenured)被寫滿?持久代(Perm)被寫滿?System,gc()被顯示調(diào)用?上一次GCZ后Heap的各上或分配策略動態(tài)變化分代垃圾回收流程示意選擇合適的垃圾收集算法串行收集器用單線程處理所有垃圾回收工作,因為無需多線程交互,所以效率比較高。但是,也無法使用多處理器的優(yōu)勢,所以此收集器適合單處理器機器。當然,此收集器也可以用在小數(shù)據(jù)量(100M左右)情況下的多處理器機器上??梢允褂?XX
8、:+UseSerialGC打開。并行收集器對年輕代進行并行垃圾冋收,因此可以減少垃圾冋收時間。一般在多線程多處理器機器上使用。使用-XX