久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Java分代垃圾回收策略原理詳解

瀏覽:82日期:2022-09-03 18:35:39

一、為什么要分代

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

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

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

二、如何分代

如圖所示:

Java分代垃圾回收策略原理詳解

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

年輕代:

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

新生代有劃分為Eden、From Survivor和To Survivor三個部分,他們對應的內(nèi)存空間的大小比例為8:1:1,也就是,為對象分配內(nèi)存的時候,首先使用Eden空間,經(jīng)過GC后,沒有被回收的會首先進入From Survivor區(qū)域,任何時候,都會保持一個Survivorq區(qū)域(From Survivor或To Survivor)完全空閑,也就是說新生代的內(nèi)存利用率最大為90%。From Survivor和To Survivor兩個區(qū)域會根據(jù)GC的實際情況,進行互換,將From Survivor區(qū)域中的對象全部復制到To Survivor區(qū)域中,或者反過來,將To Survivor區(qū)域中的對象全部復制到From Survivor區(qū)域中。

年老代:

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

GC過程中,當某些對象經(jīng)過多次GC都沒有被回收,可能會進入到年老代。或者,當新生代沒有足夠的空間來為對象分配內(nèi)存時,可能會直接在年老代進行分配。

持久代:

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

永久代實際上對應著虛擬機運行時數(shù)據(jù)區(qū)的“方法區(qū)”,這里主要存放類信息、靜態(tài)變量、常量等數(shù)據(jù)。一般情況下,永久代中對應的對象的GC效率非常低,因為這里的的大部分對象在運行都不要進行GC,它們會一直被利用,直到JVM退出。

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

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

Scavenge GC

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

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

· 年老代(Tenured)被寫滿 · 持久代(Perm)被寫滿 · System.gc()被顯示調(diào)用 ·上一次GC之后Heap的各域分配策略動態(tài)變化

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 香蕉久久网 | 国产精品欧美一区二区三区 | 午夜老湿影院 | 国产一区二区自拍 | 色综久久| 国产精品激情在线观看 | 一级片黄片毛片 | 特级生活片 | 欧美日韩一区二区在线观看 | 亚洲欧美一区二区三区在线 | 国产日韩欧美精品一区二区三区 | 午夜男人的天堂 | 中国一级毛片 | 538在线精品 | 簧片免费网站 | 黄色一级在线观看 | 亚洲区视频在线 | 看片国产 | 久久tv在线观看 | 天堂综合网久久 | 久久成人国产 | 91精品国产高清一区二区三区 | 日韩视频一区二区三区 | 亚洲精品在线视频观看 | 制服 丝袜 激情 欧洲 亚洲 | 国产乱码精品一区二区三区av | 欧美成人激情视频 | 国产成人在线一区二区 | 国产综合亚洲精品一区二 | www国产亚洲 | 日本狠狠干 | 国产精品对白一区二区三区 | 亚洲一区免费视频 | 九九热精品视频 | 欧美一区二区三区视频 | 国产精品久久久久久吹潮 | 国产高清在线看 | 黄色在线免费观看 | 精品亚洲一区二区三区 | 狠狠色狠狠色综合网 | 伊人免费观看视频 |