JVM基礎(chǔ)知識

http://liuwangshu.cn/java/jvm/1-runtime-data-area.html

JVM

組成:方法區(qū)(包含運行時常量池),堆、程序計數(shù)器、JVM棧和本地方法棧

JVM 的內(nèi)存區(qū)域可以分為兩類:線程私有和區(qū)域和線程共有的區(qū)域。?

線程私有的區(qū)域:程序計數(shù)器、JVM 虛擬機棧、本地方法棧

線程共有的區(qū)域:堆、方法區(qū)、運行時常量池

1. 方法區(qū)

別名:持久代

作用:主要用來存儲虛擬機加載的類結(jié)構(gòu)信息(版本、字段、方法、接口)、常量、靜態(tài)變量、還有及時編譯后的代碼。

特點:

1.各線程共享的內(nèi)存區(qū)域

2.內(nèi)存區(qū)域可以不連續(xù),可以動態(tài)擴展

3.該區(qū)域并不是真正的“永久代”,偶爾也會進(jìn)行內(nèi)存回收,包括對常量池的回收和內(nèi)存數(shù)據(jù)的卸載,頻率比堆內(nèi)存回收低很多

方法區(qū)無法滿足內(nèi)存需求時,會報OutOfMenmeryError異常

2. 運行時常量池

作用:主要用于存儲Java類文件常量池中的符號信息

特點:

1.是方法區(qū)的一部分,也是線程間共享

2.內(nèi)容主要來源于JVM對Class的加載

運行期間,常量池?zé)o法申請到新的空間,也會報OutOfMenmoryError異常

3. 堆

別名:Java堆、GC堆

作用:用來存儲對象實例和數(shù)組(簡單來說所有new出來的對象都存在堆內(nèi)存中)

特點:

1.各線程共享堆內(nèi)存

2.是JVM管理的內(nèi)存中最大一塊內(nèi)存區(qū)域

堆被劃分為新生代、老年代

堆空間不足,也會報OutOfMenmoryError異常

3.1

新生代:為新創(chuàng)建的對象分配內(nèi)存,目的是盡量快速回收生命周期短的對象。從上圖可知,新生代分為一個EdenSpace(伊甸園)和兩個Survivor(幸存區(qū)),分別是FromSpace和ToSpace。

大部分對象在Eden區(qū),但Eden區(qū)滿了,此區(qū)存活的對象會copy到from幸存區(qū),當(dāng)from幸存區(qū)滿,Eden和from幸存區(qū)存活的對象會被copy到to幸存區(qū),然后from和to兩個指針交換位置,保證在下一次GC之前,to幸存區(qū)是空的,當(dāng)一個對象經(jīng)過多次(有的垃圾回收器回收策略是15次)copy,就會晉升到老年代。針對新生代的垃圾回收是MinorGC。

老年代:存放生命周期很長的對象(經(jīng)過多次新生代GC仍然存活的對象),針對老年代的垃圾回收是FullGC。

持久代:就是上面介紹的方法區(qū),當(dāng)它的空間不足,也會觸發(fā)FullGC。

4. JVM棧

作用:用來描述方法執(zhí)行的內(nèi)存區(qū)域。

特點:

1.線程私有內(nèi)存區(qū)域

占空間不足,會報StackOverFlowError異常

棧的組成:

棧是用來存儲棧幀的,每當(dāng)線程調(diào)用一個方法,就會產(chǎn)生一個棧幀,壓入棧內(nèi)。

而棧幀是由局部變量表、操作數(shù)棧和幀數(shù)據(jù)區(qū)組成:

局部變量表:用來存放方法中的局部變量(包括基本數(shù)據(jù)類型和對象引用),通過索引取值。

操作數(shù)棧:可以理解為臨時存儲計算數(shù)據(jù)的區(qū)域。通過入棧出棧方式取值。

幀數(shù)據(jù)區(qū):用來記錄方法調(diào)用信息,處理方法的正常返回和異常終止。如果方法正常返回,則把當(dāng)前棧幀從棧中彈出,如果方法有返回值,則把返回值壓入到調(diào)用方法的操作數(shù)棧。也可以支持常量池解析。

5. 程序計數(shù)器

作用:保證在多線程環(huán)境中程序可以連續(xù)執(zhí)行。存放當(dāng)前線程執(zhí)行字節(jié)碼的行號,字節(jié)碼解釋器工作時,是通過改變計數(shù)器的值來選取下一條字節(jié)碼指令。

特點:

1.各線程私有內(nèi)存區(qū)域

2.JVM管理的內(nèi)存中最小的一塊內(nèi)存區(qū)域

6. 本地方法棧

跟JVM棧類似,只不過JVM棧用來執(zhí)行Java方法,而本地方法棧用來執(zhí)行Native方法。


Java垃圾回收機制(GC)

(JVM執(zhí)行GC時線程(包括主線程)都會處于等待狀態(tài),任何GC算法都是如此)

確定對象是否可以回收

兩種經(jīng)典算法確定對象是否可以被回收:引用計數(shù)算法可達(dá)性分析算法。

1.引用計數(shù)算法

簡介:根據(jù)對象被引用的數(shù)量來判斷對象是否可以被回收。

詳細(xì)描述:這是垃圾收集器早期的一種策略,堆中每個對象實例都有一個引用計數(shù)器。對象A,當(dāng)它的引用賦值給一個變量(如a = A,b = a),則引用計數(shù)器+1;當(dāng)A的引用變量生命周期結(jié)束或者設(shè)置一個新值(如a = B),那么引用計數(shù)器-1。特殊情況:當(dāng)一個對象實例被垃圾收集器回收,該對象引用的任何實例的引用計數(shù)器都-1

優(yōu)點:引用計數(shù)收集器執(zhí)行速度很快,不會長時間打斷程序的執(zhí)行。

缺點:很難解決對象之間相互循環(huán)引用問題。

2.可達(dá)性分析算法

簡介:根據(jù)對象引用鏈?zhǔn)欠窨蛇_(dá)來判斷對象是否可以被回收。

詳細(xì)描述:程序把所有的引用關(guān)系看做一張拓?fù)鋱D,通過一系列的"GC Roots"作為起點,這些節(jié)點向下索引,搜索所走過的路徑稱為引用鏈,當(dāng)一個對象沒有任何引用鏈到達(dá)"GC Roots",那么這個對象不可達(dá),可以被回收??梢宰鳛?GC Roots"的對象包括:

1.虛擬機棧和本地方法棧(棧幀的局部變量表)引用的對象

2.方法區(qū)中類靜態(tài)變量引用的對象

3.方法區(qū)中常量引用的對象

可達(dá)性算法


垃圾回收時機

垃圾回收有兩種類型:MinorGC和FullGC

MinorGC

對新生代進(jìn)行回收,不影響老年代,因為新生代對象大多死亡頻繁,所以MinorGC也會頻發(fā)觸發(fā)。

FullGC

也叫MajorGC,對整個堆進(jìn)行回收,包括新生代和老年代,由于回收范圍大,所以速度慢,因此要盡量少觸發(fā)FullGC。

對于不同的垃圾收集器,MinorGC和FullGC的觸發(fā)時機也不一樣

老年代空間不夠、永久代空間不夠或者手動調(diào)用System.gc()都會觸發(fā)FullGC。

新生代的Eden區(qū)用完會觸發(fā)MinorGC。


垃圾收集算法

經(jīng)典的垃圾回收算法有**標(biāo)記清除算法、復(fù)制算法、標(biāo)記整理算法、分代收集算法。

標(biāo)記清除算法

簡介:從根集合進(jìn)開始掃描,標(biāo)記存活的對象。再掃描整個空間中沒有被標(biāo)記的對象,進(jìn)行回收。

詳細(xì)描述:標(biāo)記和清除兩個過程的效率都不高,該算法不需要對對象進(jìn)行移動,僅清除未標(biāo)記的對象,清除之后

容易產(chǎn)生大量不連續(xù)的內(nèi)存碎片。程序運行過程中,需要分配較大的對象時,無法找到足夠的連續(xù)的內(nèi)存,可能不得不觸發(fā)另一次垃圾回收操作。

復(fù)制算法

簡介:把可用的內(nèi)存空間劃分為大小相同的兩塊,每次只使用其中一塊,當(dāng)這一塊用完之后,就把存活的對象復(fù)制到另外一塊空間,把當(dāng)前內(nèi)存空間一次性清理掉。

詳細(xì)描述:適用于對象存活率低的場景,如新生代。由于每次都對整個半?yún)^(qū)進(jìn)行回收,不用考慮內(nèi)存碎片,只要移動堆頂指針,按順序分配內(nèi)存即可,實現(xiàn)簡單高效。事實上,商用虛擬機都采用這種方式回收新生代,據(jù)統(tǒng)計,新生代每次回收大概只有10%的存活對象。

標(biāo)記整理算法

簡介:這是標(biāo)記清除算法的改進(jìn)版本,標(biāo)記過程相同,不過后續(xù)讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。

詳細(xì)介紹:類似于磁盤整理過程,適用于存活率高的老年代。對于老年代,復(fù)制算法效率會變低,因為對象存活率高,每次都要對很多對象進(jìn)行復(fù)制操作。

分代收集算法

簡介:不同生命周期的對象位于堆中不同區(qū)域,生命周期短位于新生代,生命周期長位于老年代,不同區(qū)域采取不同的回收策略,提高JVM執(zhí)行效率。

詳細(xì)描述:當(dāng)代商用虛擬機都采用了分代收集算法,新生代采用復(fù)制算法,老年代采用標(biāo)記整理算法(或標(biāo)記清除算法)。

四種引用

Java中有四種引用方式:強引用、軟引用、弱引用、虛引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容