淺談jvm中的垃圾回收策略
java和C#中的內(nèi)存的分配和釋放都是由虛擬機(jī)自動(dòng)管理的,此前我已經(jīng)介紹了CLR中GC的對(duì)象回收方式,是基于代的內(nèi)存回收策略,其實(shí)在java中,JVM的對(duì)象回收策略也是基于分代的思想。這樣做的目的就是為了提高垃圾
回收的性能,避免對(duì)堆中的所有對(duì)象進(jìn)行檢查時(shí)所帶來的程序的響應(yīng)的延遲,因?yàn)閖vm執(zhí)行GC時(shí),會(huì)stop the word,即終止其它線程的運(yùn)行,等回收完畢,才恢復(fù)其它線程的操作。基于分代的思想是:jvm在每一次執(zhí)行垃圾收集器時(shí),只是對(duì)一小部分內(nèi)存
對(duì)象引用進(jìn)行檢查,這一小部分對(duì)象的生命周期也更短,從而加快了垃圾收集的性能。下面我們將來介紹java中的基于代的內(nèi)存回收算法的基本策略:
一、jvm堆內(nèi)存的分代劃分
在基于分代的內(nèi)存回收策略中,堆空間通常都被劃分為3個(gè)代,年輕代,年老代(或者tenured代),永久代。在年輕代中又被劃分了三個(gè)小的區(qū)域,分別為:Eden(伊甸)區(qū),S0區(qū)(survivor 0),S1區(qū)(survivor 1),如下圖所示:
其中,新的對(duì)象總被分配到年經(jīng)代中,當(dāng)年輕代空間被填滿時(shí),這時(shí)需要執(zhí)行一次垃圾回收,即執(zhí)行 minor GC,回收不再被引用的對(duì)象,并同時(shí)提升幸存的對(duì)象其年齡,年經(jīng)代中的幸存對(duì)象都有年齡標(biāo)識(shí)字段,一旦其達(dá)到一定的閾值,則仍然幸存的對(duì)象將被提升到老年代空間中。
老年代的空間用于存放長(zhǎng)時(shí)間幸存的對(duì)象,即生命周期較長(zhǎng)的對(duì)象,一旦年輕代空間的幸存對(duì)象達(dá)到一定的年齡閾值后,將被自動(dòng)提升到年老代,當(dāng)年老代空間被對(duì)象填滿時(shí),這時(shí)執(zhí)行一次Major GC。相較于minor GC, Major GC的執(zhí)行次數(shù)要比minor GC要少很多,同時(shí),Major Gc 執(zhí)行的時(shí)間較Minor Gc要長(zhǎng)。因?yàn)槠渖婕暗礁嗟膶?duì)象掃描。這種分代的思想,也是基于在實(shí)踐中,對(duì)于新分配的對(duì)象具有更短的生命周期,年老的對(duì)象具有更長(zhǎng)的生命周期所作出的較佳的選擇。
與此同時(shí),Minor Gc 和 Major Gc 在執(zhí)行垃圾收集時(shí),采取的是stop the world event ,即終止正在運(yùn)行的線程,等GC執(zhí)行完畢在恢復(fù)所有的線程。
對(duì)于永久代的內(nèi)存,主要是用來存放元數(shù)據(jù)的相關(guān)信息,類及其方法的信息。當(dāng)一個(gè)類不再使用時(shí)將會(huì)被回收,當(dāng)執(zhí)行Full GC時(shí),將會(huì)掃描永久代內(nèi)存,對(duì)其進(jìn)行垃圾回收。
二、基于分代的垃圾回收的處理過程
首先,初始時(shí),新對(duì)象被分配到Eden區(qū)域,s0,s1為空。當(dāng)Eden中的空間被填滿時(shí),執(zhí)行一次Minor GC。垃圾收集器會(huì)將被引用的對(duì)象移動(dòng)s0區(qū),不再被引用的對(duì)象將被刪除,與此同時(shí),對(duì)于幸存的對(duì)象標(biāo)識(shí)其年齡為1. GC后,Eden和S1區(qū)為空如下圖所示。
下一次執(zhí)行Minor GC后,與先前的執(zhí)行步驟相同,唯一的區(qū)別時(shí),這次的被引用的對(duì)象,即幸存下來的對(duì)象將會(huì)被移動(dòng)到S1區(qū),與此同時(shí)在s0區(qū)幸存的對(duì)象的年齡會(huì)增加1,變成2,如下圖所示。
當(dāng)再次,執(zhí)行Minor GC后,與先前的步驟相同,幸存對(duì)象會(huì)被移到S0區(qū),給幸存對(duì)象年齡加1.如下圖所示
最后執(zhí)行Minor GC 時(shí),發(fā)現(xiàn) S1中的幸存的對(duì)象年齡達(dá)到8(假設(shè)閾值 設(shè)為8),此時(shí)該對(duì)象將被提升到老年代內(nèi)存中,如下圖所示。
Z
當(dāng)老年代堆空間被對(duì)象填滿時(shí),將會(huì)執(zhí)行一次Major Gc,將會(huì)清除老年代不再被引用的對(duì)象,與此同時(shí),對(duì)該空間執(zhí)行壓縮。如下圖所示。
以上這篇淺談jvm中的垃圾回收策略就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中注冊(cè)過濾器的幾種實(shí)現(xiàn)方式
本文主要介紹了SpringBoot中注冊(cè)過濾器的幾種實(shí)現(xiàn)方式,主要介紹了三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01詳解Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決
本篇文章主要介紹了Spring MVC3返回JSON數(shù)據(jù)中文亂碼問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析
這篇文章主要介紹了redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Servlet3.0學(xué)習(xí)總結(jié)之基于Servlet3.0的文件上傳實(shí)例
本篇文章主要介紹了Servlet3.0學(xué)習(xí)總結(jié)之基于Servlet3.0的文件上傳實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實(shí)現(xiàn)
本文主要介紹了SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04