1啥箭、JVM構(gòu)成
Java棧是線程私有的宜雀,每個(gè)線程創(chuàng)建的同時(shí)都會(huì)創(chuàng)建JVM棧曙砂,JVM棧中存放的為當(dāng)前線程中局部基本類(lèi)型的變量(java中定義的八種基本類(lèi)型:boolean磕谅、char眠蚂、byte煞聪、short、int逝慧、long昔脯、float、double)笛臣、部分的返回結(jié)果以及Stack Frame云稚,非基本類(lèi)型的對(duì)象在JVM棧上僅存放一個(gè)指向堆上的地址。
PC寄存器
PC寄存器是用于存儲(chǔ)每個(gè)線程下一步將執(zhí)行的JVM指令沈堡,如該方法為native的静陈,則PC寄存器中不存儲(chǔ)任何信息。
本地方法堆棧(Native Method Stacks)
JVM采用本地方法堆棧來(lái)支持native方法的執(zhí)行踱蛀,此區(qū)域用于存儲(chǔ)每個(gè)native方法調(diào)用的狀態(tài)窿给。
方法區(qū)域(Method Area)
(1)在Sun JDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱(chēng)為持久代率拒。
(2)方法區(qū)域存放了所加載的類(lèi)的信息(名稱(chēng)崩泡、修飾符等)、類(lèi)中的靜態(tài)變量猬膨、類(lèi)中定義為final類(lèi)型的常量角撞、類(lèi)中的Field信息呛伴、類(lèi)中的方法信息,當(dāng)開(kāi)發(fā)人員在程序中通過(guò)Class對(duì)象中的getName谒所、isInterface等方法來(lái)獲取信息時(shí)热康,這些數(shù)據(jù)都來(lái)源于方法區(qū)域,同時(shí)方法區(qū)域也是全局共享的劣领,在一定的條件下它也會(huì)被GC姐军,當(dāng)方法區(qū)域需要使用的內(nèi)存超過(guò)其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息尖淘。
堆(Heap)
它是JVM用來(lái)存儲(chǔ)對(duì)象實(shí)例以及數(shù)組值的區(qū)域奕锌,可以認(rèn)為Java中所有通過(guò)new創(chuàng)建的對(duì)象的內(nèi)存都在此分配,Heap中的對(duì)象的內(nèi)存需要等待GC進(jìn)行回收
不可能存在垃圾回收的地方
Java棧村生、本地方法棧惊暴、程序計(jì)數(shù)器
原因:如果存在垃圾就會(huì)一直阻塞,棧用完就會(huì)彈出去
JVM調(diào)優(yōu)指的是調(diào)優(yōu)那一部分
答案:堆趁桃、方法區(qū)(方法區(qū)也是一個(gè)特殊的堆)
2辽话、雙親委派機(jī)制
(1)、APP -> EXC -> BOOT
1卫病、類(lèi)加載器收到類(lèi)加載的請(qǐng)求
2油啤、將這個(gè)請(qǐng)求向上委托給父類(lèi)加載器去完成,一直向上委托忽肛,直到啟動(dòng)類(lèi)加載器
3村砂、啟動(dòng)加載器檢查是否能夠加載當(dāng)前這個(gè)類(lèi)烂斋,能加載就結(jié)束屹逛,使用當(dāng)前的加載器,否者拋出異常汛骂,通知子加載器進(jìn)行加載
4罕模、重復(fù)步驟3
3、堆內(nèi)存空間
常量池在方法區(qū)中
持久代/元空間也是存在堆中帘瞭,別名
"非堆"
OOM
堆內(nèi)存滿了
-Xms1024 -Xmx1024 -XX:+PrintGCDatails
啟動(dòng)時(shí)顯示JVM信息
分代收集算法
年輕代
- 存活率低
- 復(fù)制算法
老年代 - 存活率高
- 標(biāo)記清除 + 標(biāo)記壓縮 混合實(shí)現(xiàn)