jvm內(nèi)存模型
jvm內(nèi)存模型話(huà)不多說(shuō)直接上圖:

模型介紹:jvm內(nèi)存模型大體分為 線程共享 和 線程獨(dú)占,線程共享分為:堆和元區(qū)間(方法區(qū)),線程獨(dú)占分為:本地方法棧,棧和查詢(xún)寄存器
堆:存放的是new出來(lái)的所有對(duì)象
元區(qū)間:calss對(duì)象,常量池,靜態(tài)屬性
棧:本地方法,java暫時(shí)不支持棧上分配對(duì)象
本地方法棧:native修飾的方法
程序寄存器:各個(gè)線程執(zhí)行的位置
棧的模型

棧內(nèi)部是有一個(gè)個(gè)棧幀組成,每個(gè)方法都是一個(gè)棧幀,一個(gè)棧幀是由局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,返回地址組成。
局部變量表:存放方法參數(shù)和方法內(nèi)部的局部變量
操作數(shù)棧:對(duì)字節(jié)碼指令運(yùn)算是在操作數(shù)棧中執(zhí)行,入棧出棧操作
動(dòng)態(tài)鏈接: 指的是在每次執(zhí)行方法或者指令,通過(guò)常量池中的符號(hào)引用轉(zhuǎn)成直接引用找到對(duì)應(yīng)的棧幀,這就是動(dòng)態(tài)鏈接
返回地址: 方法完成返回出口,正常返回和異常返回出口兩種,返回地址中會(huì)攜帶寄存器的位置等等
垃圾回收器
GC性能指標(biāo)主要看吞吐量,暫停時(shí)間,內(nèi)存占用這三個(gè)方面著重考慮,內(nèi)存占用高并不是致命的,可以擴(kuò)張內(nèi)存來(lái)解決,最終需要解決的是吞吐量和暫停時(shí)間
吞吐量:用戶(hù)執(zhí)行時(shí)間 / (用戶(hù)執(zhí)行時(shí)間+GC回收垃圾STW的時(shí)間)占比,要想提高吞吐量只能降低gc執(zhí)行時(shí)間。
暫停時(shí)間:gc執(zhí)行回收垃圾的時(shí)間,這段時(shí)間意味著沒(méi)用應(yīng)用線程進(jìn)行執(zhí)行
吞吐量和暫停時(shí)間是相互矛盾的,gc時(shí)間降低來(lái)提高吞吐量那必定gc次數(shù)變多,如果gc時(shí)間邊長(zhǎng)必定影響吞吐量,影響用戶(hù)體驗(yàn)。選擇gc器要根據(jù)場(chǎng)景的需要來(lái)選型一下介紹常見(jiàn)的8種垃圾回收器。如圖:
圖片.png
先介紹這八種垃圾回收器
Serial
圖片.png
Serial是單線程串行垃圾回收器,復(fù)制算法,適用于單核cpu一些桌面應(yīng)用程序
ParNew

ParNew是多線程垃圾回收器,用于年輕代的回收器,垃圾回收使用復(fù)制算法,這種回收器適用于多核cpu,對(duì)于單核cpu ParNew執(zhí)行效率未必比Serial執(zhí)行效率高,單核cpu切換上下文是一種額外的開(kāi)銷(xiāo)
Parallel Scavenge

Parallel Scavenge和ParNew回收器功能一樣,區(qū)別在于Parallel Scavenge可以設(shè)置gc執(zhí)行最大時(shí)間,配置吞吐量
SerialOld

SerialOld和Serial回收器一樣,SerialOld是在老年代中使用
ParallelOld

ParallelOld和Parallel Scavenge一樣配置吞吐量,ParallelOld是在老年代中使用
CMS

CMS垃圾回收有四個(gè)步驟 "初始標(biāo)記,并發(fā)標(biāo)記,重新標(biāo)記,并發(fā)清除",在STW過(guò)程是初始標(biāo)記和重新標(biāo)記階段。
初始標(biāo)記:根據(jù)GCROOT算法標(biāo)記老年代直達(dá)對(duì)象。由于直連速度快
并發(fā)標(biāo)記:從GCROOTS直接關(guān)聯(lián)的對(duì)象進(jìn)行遍歷查找可達(dá)的對(duì)象,還有記憶集合中可達(dá)的對(duì)象這個(gè)過(guò)程比較耗時(shí),所以避免暫停時(shí)間,和用戶(hù)線程并發(fā)執(zhí)行。
重新標(biāo)記:在執(zhí)行并發(fā)標(biāo)記期間用戶(hù)線程產(chǎn)生的可達(dá)對(duì)象進(jìn)行一個(gè)重新標(biāo)記,老年代,新生代也會(huì)掃描double check
并發(fā)清除:標(biāo)記階段死亡的對(duì)象,進(jìn)行清理釋放內(nèi)存。由于存活的對(duì)象不需要移動(dòng),可以和用戶(hù)線程并發(fā)執(zhí)行。
使用標(biāo)記清除算發(fā)有個(gè)弊端,內(nèi)存碎片化,導(dǎo)致后續(xù)的內(nèi)存使用率降低(應(yīng)需要進(jìn)行內(nèi)存整理壓縮)
G1

G1收集器也是基于分代模式收集器,將內(nèi)存進(jìn)行分區(qū)(Region)分成均勻2048塊每塊大小1-32M只能是2的次方,G1弱化了分代的概念,和傳統(tǒng)分代不同在于每個(gè)同色Region在內(nèi)存上并不一定是連續(xù)的,分布在各個(gè)角落,對(duì)于回收機(jī)制,G1會(huì)分析計(jì)算回收價(jià)值最大的Region進(jìn)行回收,多個(gè)Regin區(qū)垃圾回收會(huì)重新分配到新的region區(qū)中,對(duì)于大對(duì)象一個(gè)region區(qū)放不下情況,會(huì)尋找內(nèi)存連續(xù)的區(qū)域進(jìn)行合并用于存放這種大對(duì)象,G1引入了Remember set集合記錄這些Regina區(qū)之間相互引用的對(duì)象集合,在搜索可達(dá)性對(duì)象提高效率。
G1回收過(guò)程
G1回收過(guò)程和CMS回收過(guò)程相似
初始標(biāo)記:gcroots標(biāo)記直達(dá)的對(duì)象(STW 耗時(shí)短)
并發(fā)標(biāo)記:這個(gè)過(guò)程會(huì)耗時(shí)比較長(zhǎng),但是可以和用戶(hù)線程并發(fā)執(zhí)行,從gcroots根節(jié)點(diǎn)對(duì)heap中對(duì)象進(jìn)行可達(dá)性分析,標(biāo)記存活的對(duì)象。
最終標(biāo)記:重新標(biāo)記是修正并發(fā)標(biāo)記線程和用戶(hù)線程并發(fā)執(zhí)行變動(dòng)的對(duì)象,標(biāo)記存活對(duì)象修改,包括Rememberset中的數(shù)據(jù)修正(STW)
篩選回收:G1會(huì)對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶(hù)期望的執(zhí)行時(shí)間來(lái)定制回收方案,盡可能暫停時(shí)間短回收這部分垃圾,和用戶(hù)線程并行操作
