1、JVM構(gòu)成

Java棧是線程私有的,每個線程創(chuàng)建的同時都會創(chuàng)建JVM棧,JVM棧中存放的為當(dāng)前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結(jié)果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址。
PC寄存器
PC寄存器是用于存儲每個線程下一步將執(zhí)行的JVM指令,如該方法為native的,則PC寄存器中不存儲任何信息。
本地方法堆棧(Native Method Stacks)
JVM采用本地方法堆棧來支持native方法的執(zhí)行,此區(qū)域用于存儲每個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對象中的getName、isInterface等方法來獲取信息時,這些數(shù)據(jù)都來源于方法區(qū)域,同時方法區(qū)域也是全局共享的,在一定的條件下它也會被GC,當(dāng)方法區(qū)域需要使用的內(nèi)存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。
堆(Heap)
它是JVM用來存儲對象實例以及數(shù)組值的區(qū)域,可以認為Java中所有通過new創(chuàng)建的對象的內(nèi)存都在此分配,Heap中的對象的內(nèi)存需要等待GC進行回收
不可能存在垃圾回收的地方
Java棧、本地方法棧、程序計數(shù)器
原因:如果存在垃圾就會一直阻塞,棧用完就會彈出去
JVM調(diào)優(yōu)指的是調(diào)優(yōu)那一部分
答案:堆、方法區(qū)(方法區(qū)也是一個特殊的堆)
2、雙親委派機制
(1)、APP -> EXC -> BOOT
1、類加載器收到類加載的請求
2、將這個請求向上委托給父類加載器去完成,一直向上委托,直到啟動類加載器
3、啟動加載器檢查是否能夠加載當(dāng)前這個類,能加載就結(jié)束,使用當(dāng)前的加載器,否者拋出異常,通知子加載器進行加載
4、重復(fù)步驟3
3、堆內(nèi)存空間

常量池在方法區(qū)中
持久代/元空間也是存在堆中,別名
"非堆"
OOM堆內(nèi)存滿了
-Xms1024 -Xmx1024 -XX:+PrintGCDatails啟動時顯示JVM信息
分代收集算法
年輕代
- 存活率低
- 復(fù)制算法
老年代 - 存活率高
- 標記清除 + 標記壓縮 混合實現(xiàn)