日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JVM基礎(chǔ):解析JVM分代垃圾回收策略

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

創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)邕寧,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

JVM分代垃圾回收策略的基礎(chǔ)概念

為什么要分代

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

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

  試想,在不進(jìn)行對象存活時間區(qū)分的情況下,每次垃圾回收都是對整個堆空間進(jìn)行回收,花費(fèi)時間相對會長,同時,因?yàn)槊看位厥斩夹枰闅v所有存活對象,但實(shí)際上,對于生命周期長的對象而言,這種遍歷是沒有效果的,因?yàn)榭赡苓M(jìn)行了很多次遍歷,但是他們依舊存在。因此,分代垃圾回收采用分治的思想,進(jìn)行代的劃分,把不同生命周期的對象放在不同代上,不同代上采用最適合它的垃圾回收方式進(jìn)行回收。

如何分代

  如圖所示:

  虛擬機(jī)中的共劃分為三個代:年輕代(YoungGeneration)、年老點(diǎn)(OldGeneration)和持久代(PermanentGeneration)。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關(guān)系不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。

       年輕代:

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

  年老代:

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

  持久代:

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

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

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

  ScavengeGC

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

  FullGC

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

  ◆年老代(Tenured)被寫滿

  ◆持久代(Perm)被寫滿

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

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


當(dāng)前標(biāo)題:JVM基礎(chǔ):解析JVM分代垃圾回收策略
分享網(wǎng)址:http://www.dlmjj.cn/article/djssjgi.html