概念
虛擬機(jī):指以軟件的方式模擬具有完整硬件系統(tǒng)功能、運(yùn)行在一個完全隔離環(huán)境中的完整計(jì)算機(jī)系統(tǒng) ,是物理機(jī)的軟件實(shí)現(xiàn)。常用的虛擬機(jī)有VMWare,Visual Box,Java Virtual Machine(Java虛擬機(jī),簡稱JVM)。
Java虛擬機(jī)陣營:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…
啟動流程
基本架構(gòu)
Java運(yùn)行時編譯源碼(.java)成字節(jié)碼,由jre運(yùn)行。jre由java虛擬機(jī)(jvm)實(shí)現(xiàn)。Jvm分析字節(jié)碼,后解釋并執(zhí)行。
JVM由三個主要的子系統(tǒng)構(gòu)成:
1.類加載器子系統(tǒng)
2.運(yùn)行時數(shù)據(jù)區(qū)(內(nèi)存)
3.執(zhí)行引擎
垃圾收集(GC:Garbage Collection)
1、如何識別垃圾,判定對象是否可被回收?
引用計(jì)數(shù)法:給每個對象添加一個計(jì)數(shù)器,當(dāng)有地方引用該對象時計(jì)數(shù)器加1,當(dāng)引用失效時計(jì)數(shù)器減1。用對象計(jì)數(shù)器是否為0來判斷對象是否可被回收。缺點(diǎn):無法解決循環(huán)引用的問題
根搜索算法:也稱可達(dá)性分析法,通過“GC
ROOTs”的對象作為搜索起始點(diǎn),通過引用向下搜索,所走過的路徑稱為引用鏈。通過對象是否有到達(dá)引用鏈的路徑來判斷對象是否可被回收(可作為GC
ROOTs的對象:虛擬機(jī)棧中引用的對象,方法區(qū)中類靜態(tài)屬性引用的對象,方法區(qū)中常量引用的對象,本地方法棧中JNI引用的對象)
2、Java 中的堆是 GC 收集垃圾的主要區(qū)域,GC 分為兩種:Minor GC、Full GC ( 或稱為 Major GC )。
Minor GC:新生代(Young Gen)空間不足時觸發(fā)收集,由于Java 中的大部分對象通常不需長久存活,新生代是GC收集頻繁區(qū)域,所以采用復(fù)制算法。
Full GC:老年代(Old Gen )空間不足或元空間達(dá)到高水位線執(zhí)行收集動作,由于存放大對象及長久存活下的對象,占用內(nèi)存空間大,回收效率低,所以采用標(biāo)記-清除算法。
GC算法
按照回收策略劃分為:標(biāo)記-清除算法,標(biāo)記-整理算法,復(fù)制算法。
1.標(biāo)記-清除算法:分為兩階段“標(biāo)記”和“清除”。首先標(biāo)記出哪些對象可被回收,在標(biāo)記完成之后統(tǒng)一回收所有被標(biāo)記的對象所占用的內(nèi)存空間。不足之處:1.無法處理循環(huán)引用的問題2.效率不高3.產(chǎn)生大量內(nèi)存碎片(ps:空間碎片太多可能會導(dǎo)致以后在分配大對象的時候而無法申請到足夠的連續(xù)內(nèi)存空間,導(dǎo)致提前觸發(fā)新一輪gc)
2.標(biāo)記-整理算法:分為兩階段“標(biāo)記”和“整理”。首先標(biāo)記出哪些對象可被回收,在標(biāo)記完成后,將對象向一端移動,然后直接清理掉邊界以外的內(nèi)存。
3.復(fù)制算法:把內(nèi)存空間劃為兩個相等的區(qū)域,每次只使用其中一個區(qū)域。gc時遍歷當(dāng)前使用區(qū)域,把正在使用中的對象復(fù)制到另外一個區(qū)域中。算法每次只處理正在使用中的對象,因此復(fù)制成本比較小,同時復(fù)制過去以后還能進(jìn)行相應(yīng)的內(nèi)存整理,不會出現(xiàn)“碎片”問題。不足之處:1.內(nèi)存利用率問題2.在對象存活率較高時,其效率會變低。
按分區(qū)對待可分為:增量收集算法,分代收集算法
1.增量收集:實(shí)時垃圾回收算法,即:在應(yīng)用進(jìn)行的同時進(jìn)行垃圾回收,理論上可以解決傳統(tǒng)分代方式帶來的問題。增量收集把對堆空間劃分成一系列內(nèi)存塊,使用時先使用其中一部分,垃圾收集時把之前用掉的部分中的存活對象再放到后面沒有用的空間中,這樣可以實(shí)現(xiàn)一直邊使用邊收集的效果,避免了傳統(tǒng)分代方式整個使用完了再暫停的回收的情況。
2.分代收集:(商用默認(rèn))基于對象生命周期劃分為新生代、老年代、元空間,對不同生命周期的對象使用不同的算法進(jìn)行回收。
按系統(tǒng)線程可分為:串行收集算法,并行收集算法,并發(fā)收集算法
1.串行收集:使用單線程處理垃圾回收工作,實(shí)現(xiàn)容易,效率較高。不足之處:1.無法發(fā)揮多處理器的優(yōu)勢 2.需要暫停用戶線程
2.并行收集:使用多線程處理垃圾回收工作,速度快,效率高。理論上CPU數(shù)目越多,越能體現(xiàn)出并行收集器的優(yōu)勢。不足之處:需要暫停用戶線程
3.并發(fā)收集:垃圾線程與用戶線程同時工作。系統(tǒng)在垃圾回收時不需要暫停用戶線程
GC收集器常用組合
JVM性能調(diào)優(yōu)思路
常見異常
StackOverflowError:(棧溢出)
OutOfMemoryError: Java heap space(堆空間不足)
OutOfMemoryError: GC overhead limit exceeded (GC花費(fèi)的時間超過 98%, 并且GC回收的內(nèi)存少于 2%)
今天分享一套比較全面的java學(xué)習(xí)視頻,Java系統(tǒng)學(xué)習(xí)必備教程,值得大家拿來參考學(xué)習(xí),希望能對大家有幫助哈!有Spring,MyBatis,Netty源碼分析 ,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識體系。
需要的小伙伴,麻煩幫忙轉(zhuǎn)發(fā)一下這篇文章+關(guān)注我,然后添加小助手VX:xuanwo008。
需要面試題的小伙伴,可以需要的小伙伴,添加小助手VX:xuanwo008即可免費(fèi)領(lǐng)取哦。
幫忙轉(zhuǎn)發(fā)哦