溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM的內(nèi)存模型和垃圾回收機制

發(fā)布時間:2021-09-17 15:56:16 來源:億速云 閱讀:97 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“JVM的內(nèi)存模型和垃圾回收機制”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

JVM的內(nèi)存模型和垃圾回收機制

jvm的內(nèi)存模型和heap的分代模型如上圖所示

名稱是否線程共享存放內(nèi)容
虛擬機棧局部變量表、方法出口等
本地方法棧native方法
程序計數(shù)器當前線程支持的字節(jié)碼命令
方法區(qū)jvm加載的類信息、常量、靜態(tài)變量等
創(chuàng)建的java對象

分代原因:提升GC性能和方便內(nèi)存分配

1. 內(nèi)存分配

  • 新生代與老年代的比值大概是1:3

  • eden區(qū)和surviver區(qū)的比值默認8:1

2. 內(nèi)存回收

        幾乎所有的java對象都是在eden區(qū)出生的,當eden區(qū)沒有足夠的空間時虛擬機會發(fā)起一次minorGC,此后存活下的對象會被放到seurvier區(qū),如果surviver區(qū)的空間不夠,則根據(jù)內(nèi)存擔保原則分配到老年代。

  • 垃圾確認原則:應(yīng)用技術(shù)法與可達性分析法

  1. 引用計數(shù)法:即一個對象如果沒有任何與之關(guān)聯(lián)的引用,即他們的引用計數(shù)都不為0,則說明對象不太可能再被用到,那么這個對象就是可回收對象(可是會有循環(huán)引用的問題)。

  2. 可達性分析法:解決引用計數(shù)法的循環(huán)引用問題,如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。要注意的是,不可達對象不等價于可回收對象,不可達對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。

  • miborGC(復(fù)制-》清空-》互換)流程:eden、servicorFrom 中存活對象復(fù)制到ServicorTo,年齡+1,15代之后進入老年代,大對象直接進入老年代;-》清空eden、servicorFrom;-》 ServicorTo和ServicorFrom互換。

  • 垃圾回收內(nèi)存擔保原則:老年代中的連續(xù)可用內(nèi)存空間大于新生代對象總大小或者歷次晉升到老年代對象平均大小就執(zhí)行minorGC,否則就fullGC.

3. 垃圾回收算法

  • 新生代采用標記-復(fù)制算法回收內(nèi)存,理論上需要一半的內(nèi)存來復(fù)制對象(不易產(chǎn)生內(nèi)存碎片,但是可用內(nèi)存會被壓縮一半),但是95%的對象都是朝生夕死,所以將新生代中的復(fù)制區(qū)域劃分為8:1,也就是可以使用整個新生代內(nèi)存的90%,而不是一半。

  • 老年代采用的是標記-清除算法來回收內(nèi)存,會產(chǎn)生不連續(xù)的內(nèi)存碎片。

  • 永久代(或者方法區(qū))也可以回收,就是回收條件比較苛刻

  1. java堆中不存在該類實例

  2. 該類的classLoader都被回收

  3. 該類的java.long.Class都被回收,無法通過反射訪問改方法,滿足以上三條件,方法區(qū)內(nèi)的類就被回收了。

4. 垃圾收集器

JVM的內(nèi)存模型和垃圾回收機制

垃圾收集器對比
      名稱    使用范圍  原理                                         優(yōu)缺點                                 
Serial新生代單線程,復(fù)制算法簡單高效,java虛擬機client模式下默認新生代垃圾收集器
ParNew新生代Serial+多線程ParNew收集器默認開啟和CPU數(shù)目相同的線程數(shù),java虛擬機運行在Server模式下新生代的默認垃圾收集器,ParNew垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程
Parallel Scavenge新生代多線程復(fù)制算法重點關(guān)注的是程序達到一個可控制的吞吐量
Serial Old(MSC) 老年代單線程標記整理算法Client默認的java虛擬機默認的年老代垃圾收集器,也會暫停所有線程
Parallel Old老年代多線程標記整理算法Parallel Old正是為了在年老代同樣提供吞吐量優(yōu)先的垃圾收集器,如果系統(tǒng)對吞吐量要求比較高,可以優(yōu)先考慮新生代Parallel Scavenge和年老代Parallel Old收集器的搭配策略
CMS老年代多線程標記清除算法

主要目標是獲取最短垃圾回收停頓時間,

最短的垃圾收集停頓時間可以為交互比較高的程序提高用戶體驗,總體上來看CMS收集器的內(nèi)存回收和用戶線程是一起并發(fā)地執(zhí)行

G1新生代/老年代
  1. 基于標記-整理算法,不產(chǎn)生內(nèi)存碎片。

  2. 可以非常精確控制停頓時間,在不犧牲吞吐量前提下,實現(xiàn)低停頓垃圾回收

G1收集器避免全區(qū)域垃圾收集,它把堆內(nèi)存劃分為大小固定的幾個獨立區(qū)域,并且跟蹤這些區(qū)域的垃圾收集進度,同時在后臺維護一個優(yōu)先級列表,每次根據(jù)所允許的收集時間,優(yōu)先回收垃圾最多的區(qū)域。區(qū)域劃分和優(yōu)先級區(qū)域回收機制,確保G1收集器可以在有限時間獲得最高的垃圾收集效。

5. 結(jié)語

        jvm的內(nèi)存回收依賴垃圾收集器,而垃圾收集器是垃圾回收算法的具體實現(xiàn),可以通過啟動參數(shù)指定不同的新生代,老年代的垃圾回收器。所有垃圾回收器的優(yōu)化方向都是盡可能的降低“stop the world”的耗時,也就是垃圾回收線程執(zhí)行耗時,盡可能的提高cpu的吞吐量。不同的實現(xiàn)方案造成了不同的垃圾回收器。如serial,parallel,cms,沒有一種能夠適應(yīng)所有的垃圾回收需求,都是根據(jù)義務(wù)需求組合使用,目前最牛掰的是G1回收器,但是生產(chǎn)環(huán)境幾乎沒有使用。

“JVM的內(nèi)存模型和垃圾回收機制”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI