1、JVM構(gòu)成

Java棧是線程私有的,每個(gè)線程創(chuàng)建的同時(shí)都會(huì)創(chuàng)建JVM棧,JVM棧中存放的為當(dāng)前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結(jié)果以及Stack Frame,非基本類型的對(duì)象在JVM棧上僅存放一個(gè)指向堆上的地址。
PC寄存器
PC寄存器是用于存儲(chǔ)每個(gè)線程下一步將執(zhí)行的JVM指令,如該方法為native的,則PC寄存器中不存儲(chǔ)任何信息。
本地方法堆棧(Native Method Stacks)
JVM采用本地方法堆棧來支持native方法的執(zhí)行,此區(qū)域用于存儲(chǔ)每個(gè)native方法調(diào)用的狀態(tài)。
方法區(qū)域(Method Area)
(1)在Sun JDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱為持久代。
(2)方法區(qū)域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當(dāng)開發(fā)人員在程序中通過Class對(duì)象中的getName、isInterface等方法來獲取信息時(shí),這些數(shù)據(jù)都來源于方法區(qū)域,同時(shí)方法區(qū)域也是全局共享的,在一定的條件下它也會(huì)被GC,當(dāng)方法區(qū)域需要使用的內(nèi)存超過其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息。
堆(Heap)
它是JVM用來存儲(chǔ)對(duì)象實(shí)例以及數(shù)組值的區(qū)域,可以認(rèn)為Java中所有通過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、類加載器收到類加載的請(qǐng)求
2、將這個(gè)請(qǐng)求向上委托給父類加載器去完成,一直向上委托,直到啟動(dòng)類加載器
3、啟動(dòng)加載器檢查是否能夠加載當(dāng)前這個(gè)類,能加載就結(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)