JVM面試詳解

1、JVM構(gòu)成

image.png

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)存空間

image.png

常量池在方法區(qū)中
持久代/元空間也是存在堆中,別名"非堆"

OOM堆內(nèi)存滿了

-Xms1024 -Xmx1024 -XX:+PrintGCDatails啟動時顯示JVM信息

分代收集算法

年輕代

  • 存活率低
  • 復(fù)制算法
    老年代
  • 存活率高
  • 標記清除 + 標記壓縮 混合實現(xiàn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容