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