重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
本篇內(nèi)容介紹了“JVM的內(nèi)存模型和垃圾回收機(jī)制”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、納溪網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為納溪等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
jvm的內(nèi)存模型和heap的分代模型如上圖所示
名稱 | 是否線程共享 | 存放內(nèi)容 |
虛擬機(jī)棧 | 否 | 局部變量表、方法出口等 |
本地方法棧 | 否 | native方法 |
程序計(jì)數(shù)器 | 否 | 當(dāng)前線程支持的字節(jié)碼命令 |
方法區(qū) | 是 | jvm加載的類信息、常量、靜態(tài)變量等 |
堆 | 是 | 創(chuàng)建的java對象 |
分代原因:提升GC性能和方便內(nèi)存分配
1. 內(nèi)存分配
新生代與老年代的比值大概是1:3
eden區(qū)和surviver區(qū)的比值默認(rèn)8:1
2. 內(nèi)存回收
幾乎所有的java對象都是在eden區(qū)出生的,當(dāng)eden區(qū)沒有足夠的空間時(shí)虛擬機(jī)會(huì)發(fā)起一次minorGC,此后存活下的對象會(huì)被放到seurvier區(qū),如果surviver區(qū)的空間不夠,則根據(jù)內(nèi)存擔(dān)保原則分配到老年代。
垃圾確認(rèn)原則:應(yīng)用技術(shù)法與可達(dá)性分析法
引用計(jì)數(shù)法:即一個(gè)對象如果沒有任何與之關(guān)聯(lián)的引用,即他們的引用計(jì)數(shù)都不為0,則說明對象不太可能再被用到,那么這個(gè)對象就是可回收對象(可是會(huì)有循環(huán)引用的問題)。
可達(dá)性分析法:解決引用計(jì)數(shù)法的循環(huán)引用問題,如果在“GC roots”和一個(gè)對象之間沒有可達(dá)路徑,則稱該對象是不可達(dá)的。要注意的是,不可達(dá)對象不等價(jià)于可回收對象,不可達(dá)對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標(biāo)記過程。兩次標(biāo)記后仍然是可回收對象,則將面臨回收。
miborGC(復(fù)制-》清空-》互換)流程:eden、servicorFrom 中存活對象復(fù)制到ServicorTo,年齡+1,15代之后進(jìn)入老年代,大對象直接進(jìn)入老年代;-》清空eden、servicorFrom;-》 ServicorTo和ServicorFrom互換。
垃圾回收內(nèi)存擔(dān)保原則:老年代中的連續(xù)可用內(nèi)存空間大于新生代對象總大小或者歷次晉升到老年代對象平均大小就執(zhí)行minorGC,否則就fullGC.
3. 垃圾回收算法
新生代采用標(biāo)記-復(fù)制算法回收內(nèi)存,理論上需要一半的內(nèi)存來復(fù)制對象(不易產(chǎn)生內(nèi)存碎片,但是可用內(nèi)存會(huì)被壓縮一半),但是95%的對象都是朝生夕死,所以將新生代中的復(fù)制區(qū)域劃分為8:1,也就是可以使用整個(gè)新生代內(nèi)存的90%,而不是一半。
老年代采用的是標(biāo)記-清除算法來回收內(nèi)存,會(huì)產(chǎn)生不連續(xù)的內(nèi)存碎片。
永久代(或者方法區(qū))也可以回收,就是回收條件比較苛刻
java堆中不存在該類實(shí)例
該類的classLoader都被回收
該類的java.long.Class都被回收,無法通過反射訪問改方法,滿足以上三條件,方法區(qū)內(nèi)的類就被回收了。
4. 垃圾收集器
名稱 | 使用范圍 | 原理 | 優(yōu)缺點(diǎn) |
---|---|---|---|
Serial | 新生代 | 單線程,復(fù)制算法 | 簡單高效,java虛擬機(jī)client模式下默認(rèn)新生代垃圾收集器 |
ParNew | 新生代 | Serial+多線程 | ParNew收集器默認(rèn)開啟和CPU數(shù)目相同的線程數(shù),java虛擬機(jī)運(yùn)行在Server模式下新生代的默認(rèn)垃圾收集器,ParNew垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程 |
Parallel Scavenge | 新生代 | 多線程復(fù)制算法 | 重點(diǎn)關(guān)注的是程序達(dá)到一個(gè)可控制的吞吐量 |
Serial Old(MSC) | 老年代 | 單線程標(biāo)記整理算法 | Client默認(rèn)的java虛擬機(jī)默認(rèn)的年老代垃圾收集器,也會(huì)暫停所有線程 |
Parallel Old | 老年代 | 多線程標(biāo)記整理算法 | Parallel Old正是為了在年老代同樣提供吞吐量優(yōu)先的垃圾收集器,如果系統(tǒng)對吞吐量要求比較高,可以優(yōu)先考慮新生代Parallel Scavenge和年老代Parallel Old收集器的搭配策略 |
CMS | 老年代 | 多線程標(biāo)記清除算法 | 主要目標(biāo)是獲取最短垃圾回收停頓時(shí)間, 最短的垃圾收集停頓時(shí)間可以為交互比較高的程序提高用戶體驗(yàn),總體上來看CMS收集器的內(nèi)存回收和用戶線程是一起并發(fā)地執(zhí)行 |
G1 | 新生代/老年代 |
| G1收集器避免全區(qū)域垃圾收集,它把堆內(nèi)存劃分為大小固定的幾個(gè)獨(dú)立區(qū)域,并且跟蹤這些區(qū)域的垃圾收集進(jìn)度,同時(shí)在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次根據(jù)所允許的收集時(shí)間,優(yōu)先回收垃圾最多的區(qū)域。區(qū)域劃分和優(yōu)先級(jí)區(qū)域回收機(jī)制,確保G1收集器可以在有限時(shí)間獲得最高的垃圾收集效。 |
5. 結(jié)語
jvm的內(nèi)存回收依賴?yán)占鳎占魇抢厥账惴ǖ木唧w實(shí)現(xiàn),可以通過啟動(dòng)參數(shù)指定不同的新生代,老年代的垃圾回收器。所有垃圾回收器的優(yōu)化方向都是盡可能的降低“stop the world”的耗時(shí),也就是垃圾回收線程執(zhí)行耗時(shí),盡可能的提高cpu的吞吐量。不同的實(shí)現(xiàn)方案造成了不同的垃圾回收器。如serial,parallel,cms,沒有一種能夠適應(yīng)所有的垃圾回收需求,都是根據(jù)義務(wù)需求組合使用,目前最牛掰的是G1回收器,但是生產(chǎn)環(huán)境幾乎沒有使用。
“JVM的內(nèi)存模型和垃圾回收機(jī)制”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!