更新時(shí)間:2022-06-28 來源:黑馬程序員 瀏覽量:
jvm是一種能夠運(yùn)行java字節(jié)碼的虛擬機(jī)。由類裝載子系統(tǒng)、運(yùn)行時(shí)數(shù)據(jù)區(qū)(內(nèi)存模型) 和字節(jié)碼執(zhí)行引擎三部分組成,跨平臺 ,從軟件層面屏蔽不同操作系統(tǒng)在底層硬件與指令上的區(qū)別,實(shí)現(xiàn)一處編寫多處運(yùn)行運(yùn)行之前通過javac命令將轉(zhuǎn)成字節(jié)碼文件,當(dāng)字節(jié)碼文件運(yùn)行時(shí) JVM就開始工作了。
堆 : new出來的對象都放在堆里,堆分為老年代和年輕代,老年代占整個(gè)堆的2/3,年輕代占1/3.年輕代又分為三塊:伊甸園區(qū),survivor區(qū)(s0和s1),比例8:1:1 .當(dāng)伊甸園區(qū)里面的對象裝滿了,字節(jié)碼引擎會(huì)執(zhí)行一個(gè)垃圾回收線程(minor(蠻呢兒) gc)將非垃圾對象復(fù)制到survivor區(qū),然后刪除垃圾對象
棧 :只要一個(gè)線程在運(yùn)行,Java虛擬機(jī)就會(huì)給這個(gè)線程分配一點(diǎn)內(nèi)存空間, 這塊空間就叫做線程棧(用來放方法內(nèi)部自己的局部變量) 一個(gè)方法對應(yīng)一塊棧幀內(nèi)存區(qū)域
程序計(jì)數(shù)器 :每一個(gè)程序運(yùn)行的時(shí)候都會(huì)分配一個(gè)程序計(jì)數(shù)器,記錄馬上要執(zhí)行代碼的內(nèi)存地址,作用就是當(dāng)前線程被搶走執(zhí)行權(quán),恢復(fù)執(zhí)行的時(shí)候就從記錄的內(nèi)存地址繼續(xù)運(yùn)行
方法區(qū) : 存放常量,靜態(tài)變量,類信息(字節(jié)碼文件被加載后就放到方法區(qū))
本地方法棧 :執(zhí)行本地方法的時(shí)候分配的內(nèi)存空間由本地方法棧提供,底層用C C++語言寫的方法就是本地方法
調(diào)優(yōu)目的: 在回收垃圾的時(shí)候會(huì)停止用戶進(jìn)程(STW) stop the word ,專心做垃圾回收,減少GC(minor full)
為什么要有SWT: 當(dāng)程序運(yùn)行的過程中,產(chǎn)生了垃圾,full GC就開始找垃圾,從局部變量開始找完了所有的對象,都標(biāo)記成非垃圾對象,然后在找其他變量.如果有一個(gè)線程,GC線程還沒結(jié)束,它先結(jié)束了,那它里面的棧內(nèi)存空間會(huì)被釋放,釋放掉就意味著局部變量表沒有了,局部變量也被銷毀了,那剛剛GC找垃圾的時(shí)候明明把這些對象標(biāo)記未非垃圾對象,現(xiàn)在又變成垃圾了,這不合適 . 所以在回收垃圾的時(shí)候,讓用戶線程先停掉,不要影響對象的狀態(tài) , 標(biāo)記好了再把垃圾清理,可能性能還要高一點(diǎn)
能否對JVM調(diào)優(yōu),讓其幾乎不發(fā)生Full GC :
調(diào)優(yōu)工具: Arthas(阿爾薩斯) 它是阿里巴巴開源的java診斷工具,支持JDK6+,采用命令行交互模式.使用簡便,監(jiān)控進(jìn)程。