當前位置:
首頁 > 知識 > 深入理解JVM之對象 生命周期

深入理解JVM之對象 生命周期

JVM詳解之對象生命周期

什麼叫垃圾?垃圾是怎樣產生的?垃圾怎麼回收?

java和C、C++中的垃圾區別

C和C++中的對象生存周期完全有編程者決定,而java中對象的生存周期默認由虛擬機決定,但是也允許編程者顯式的調用gc()方法。因此對於java開發人員,我們可以肆意妄為的new對象,而不用管理對象的生存周期,這對於編程自然是方便的。不過,要想讓程序更好的運行,我們就要理解java中的對象生存周期,從創造到被銷毀的整個過程。下面就淺析一下java的對象生命周期。

談引用(理解對象的存在)

在談到對象的時候,就離不開引用(和c++中的指針很類似),在創建對象的時候,會在虛擬機棧中新建一塊內存地址,此內存地址中存儲的是對象的引用(reference類型)地址,指向java堆中或者方法區的常量池中的對象(這個對象是真實存在的,我們要進行操作的對象)。

在jdk1.2之後,java對引用進行擴充。分為以下四種:

強引用(Strong Reference):如「Object obj = new Object()」,這類引用是 Java 程序中最普遍的。只要強引用還存在,垃圾收集器就永遠不會回收掉被引用的對象。

軟引用(Soft Reference):它用來描述一些可能還有用,但並非必須的對象。在系統內存不夠用時,這類引用關聯的對象將被垃圾收集器回收。JDK1.2 之後提供了 SoftReference 類來實現軟引用。

弱引用(Weak Reference):它也是用來描述非需對象的,但它的強度比軟引用更弱些,被弱引用關聯的對象只能生存島下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。在 JDK1.2 之後,提供了 WeakReference 類來實現弱引用。

虛引用(Phantom Reference):最弱的一種引用關係,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。為一個對象設置虛引用關聯的唯一目的是希望能在這個對象被收集器回收時收到一個系統通知。JDK1.2 之後提供了 PhantomReference 類來實現虛引用。

註:四種引用的解釋參考《深入理解Java虛擬機》,小夥伴們可以當做擴展,實際工作中很少會用到。

對象的創建後的狀態以及發展

先貼一張圖

參考上一篇《深入理解JVM之基本構架》

新對象當我們創建一般對象後,對象優先會存在【Eden】新生代中。

大對象直接進入老年代。

大對象的含義:長字元串、數組等。在開發中應盡量避免使用大對象。因為大對象的存在會導致老年代空間提前觸發【Full GC】,而【Full GC】的速度一般都會比較慢, 並且【Full GC】會導致Stop The World。

長期存活的對象將進入老年代。

每一個對象都有一個對象年齡計數器。如果Eden中的對象經過一次【Minor GC】就會進入【Survivor】中,並且計數器變成1。每當發生一次【Minor GC】後,計數器就會加1,當到達一定的程度後,該對象就會晉陞到【Old】老年代中。

註解:【Minor GC】和【Full GC】的區別

【Minor GC】(新生代GC):發生在【Eden Space】區域的垃圾回收,因為java中的對象存在的時間比較短,因此【Minor GC】是非常頻繁的,而且速度也會很快。

【Full GC】(老年代GC)【Major GC】:前面三個名詞屬於一個意思,只是不同的叫法而已。指發生在【Old Space】區域的垃圾回收,【Full GC】的過程比較慢,大概是【Minor GC】的10倍以上,而且會伴隨一次Stop-The-World。

解釋stop-the-World

在開始學習GC之前你應該知道一個詞:stop-the-world。不管選擇哪種GC演算法,stop-the-world都是不可避免的。Stop-the-world意味著從應用中停下來並進入到GC執行過程中去。一旦Stop-the-world發生,除了GC所需的線程外,其他線程都將停止工作,中斷了的線程直到GC任務結束才繼續它們的任務。GC調優通常就是為了改善stop-the-world的時間。

分析對象怎麼變成垃圾的? 什麼時候垃圾可以回收?

java採用可達性分析演算法,我們就不管它是什麼演算法,我們要知道的是什麼時候對象變成垃圾了。

先貼圖說話

在上圖中,有一個GC ROOT Set區域,此區域中,下面的對象,無論通過多少個引用,只要能指向GC Roots的引用,此對象,就不會被回收。也就是從【GC Roots】到這個對象不可達時,此對象就變成了垃圾。而可以作為【GC Roots】的對象包括如下四種:

虛擬機棧(棧楨中的本地變數表)中的引用的對象

方法區中的類靜態屬性引用的對象

方法區中的常量引用的對象

本地方法棧中JNI的引用的對象

但是要記住垃圾歸垃圾,它並沒有死亡,也沒有被回收,只有發生【Minor GC】或者【Full GC】時才可能被回收。

標記 - 清除演算法(Mark-Sweep)

首先標記三種標記的內存狀態,標記完成後,只是把【可回收內存】清除掉就可以了,這種演算法就是簡單的【標記-清除演算法】。

標記 - 整理演算法(Mark-Compact)

首先標記三種標記的內存狀態,這個步驟和標記-清除演算法一樣。標記完成後,把【存活對象】移向一端,然後直接清理掉邊界以外的內存,這種演算法就是【標記-整理演算法】。

複製演算法

簡介垃圾收集演算法

這種演算法會浪費一半的內存空間,我們稱為A、B兩塊空間。當使用A空間的時候,B空閑,每當A空間使用完後,就將存活對象複製到B空間中,並將A中的空間清理掉。這樣每次都是對一半的內存進行內存回收。小夥伴們想一下,一半的空間都在浪費,這是無法承受的。因此,就出現了【分代收集演算法】。

分代收集演算法

分代收集演算法,就不貼圖了,請看第一個圖片。有【Eden】【S0】【S1】【Old】

因為在新生代中大多數對象都是「朝生夕死」的,因此不必要按照「1:1」的比例來分配空間,HotSpot虛擬機按照【Eden】:【S0】:【S1】=8:1:1的比例來配備內存,先說一下過程,首先使用【Eden】和【S0】,當回收時,將存活對象複製到【S1】中,並整理【Eden】和【S0】;以此往複。如果【S1】中的內存小於存活對象需要的內存的時候(【S1】空間不夠用的時候),就借用【Old】的內存來擔保。

分析HotSpot的垃圾收集器(參考《深入理解Java虛擬機》P75)

Serial

Serial Old

Serial收集器是一個單線程的收集器,但它的「單線程」的意義並不僅僅說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。Stop -The -World

Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用標記-整理演算法。

Parallel Scavenge

Parallel Old

Parallel Scavenge收集器是一個新生代收集器,它也是使用複製演算法的收集器,又是並行的多線程收集器。Parallel Scavenge收集器的目標則是達到一個可控制的吞吐量(Throughput)。

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」演算法。

-CMS(Concurrent Mark Sweep)

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。

-G1(Garbage First)

G1(Garbage-First)是一款面向服務端應用的垃圾收集器。HotSpot開發團隊賦予它的使命是未來可以替換掉JDK 1.5中發布的CMS收集器。與其他GC收集器相比,G1具備如下特點。並行與並發;分代收集;空間整合;可預測的停頓。

在G1之前的其他收集器進行收集的範圍都是整個新生代或者老年代,而G1不再是這樣。使用G1收集器時,Java堆的內存布局就與其他收集器有很大差別,它將整個Java堆劃分為多個大小相等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,它們都是一部分Region(不需要連續)的集合。

-ParNew

是Serial的多線程版本。和(CMS或者Serial Old配合工作。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

你真的決心學習好Java了嗎?
程序員的八個級別,你屬於哪個級別?
自學Java難以成功 為什麼?
零基礎如何系統化的學習JAVA
碼農們千萬不要錯過的熱門風向

TAG:java學習吧 |

您可能感興趣

JS內置對象之數組詳解
RISC-V首度被我國列入扶持對象,上海已成RISC-V重要「據點」
JSON 對象
JSP 隱式對象
JVM中的對象內存布局?
女生撩暗戀對象 VS 男生撩暗戀對象
王嘉爾吐槽JB心結難解,JYP成團欺對象,GOT7帶來回歸預熱舞台!
Facebook新專利可在VR環境中表徵真實世界對象,讓目標對象自然地融入虛擬環境
Python入門基礎之面向對象四:運算符重載
NBA第一女神,老大科比最理想的約會對象
ASP File 對象
XML DOM-Attr 對象
男生在學校處對象VS女生在學校處對象,網友:想有同款男生媽媽
賀建奎團隊的研究對象納入標準:HIV抗體母親陰性
B.I毒品相關聊天對象確認為前YG練習生韓瑞熙
XML DOM-Comment 對象
SDS之Object Storage:對象存儲-生於時代,長於場景
C++對象的使用:四種對象生存期和作用域、static 用法總結
jQuery對象與DOM對象區別與轉換
今年正財星入命,能與合意對象進入婚姻