1. JVM 由哪些區(qū)域構(gòu)成?
由類加載器和運行時數(shù)據(jù)區(qū)構(gòu)成;運行時數(shù)據(jù)區(qū)又分為線程私有和線程共享兩大區(qū)域,線程私有的包括程序計數(shù)器、虛擬機棧和本地方法棧,線程共享的包括堆和方法區(qū)。
2. 類加載器的作用是什么?
加載 class 文件,生成類的結(jié)構(gòu)信息,將其存放在方法區(qū)。
3. 類加載器有哪些種類以及它們之間的關(guān)系是什么?
Bootstrap ClassLoader,加載 lib 下面的類;Extension ClassLoader,加載擴展類,即 jre/ext 下面的類;Application ClassLoader,加載用戶編寫的類;還可以繼承 ClassLoader 類自定義類加載器。Application ClassLoader 是 Extension ClassLoader 的子類,Extension ClassLoader 又是 Bootstrap ClassLoader 的子類。
4. 什么是雙親委派機制?
簡單地說就是要加載類時先找自己的父類去進行加載。比如要加載 A.class,首先 Application ClassLoader 會先找自己的父類,即 Extension ClassLoader,Extension ClassLoader 又會先找自己的父類,即 Bootstrap ClassLoader,它沒加載到,再告訴 Extension ClassLoader,它又沒加載到,才輪到 Application ClassLoader 去加載。這就是雙親委派機制,可以保證優(yōu)先加載 JDK 自己的類。
5. 類的加載過程是怎樣的?
加載:將 class 文件加載進內(nèi)存; 驗證:驗證 class 文件的正確性; 準(zhǔn)備:給類中的靜態(tài)變量分配空間; 解析:將 class 常量池中的符號引用替換成直接引用; 初始化:對靜態(tài)變量和靜態(tài)代碼塊進行初始化。
6. 說說你對棧內(nèi)存的認(rèn)識?
棧內(nèi)存是線程私有的一塊區(qū)域,分為虛擬機棧和本地方法棧?;绢愋偷淖兞俊ο蟮囊米兞亢蛯嵗椒ǘ际窃跅V蟹峙涞?。棧的內(nèi)存地址是連續(xù)的,不存在垃圾回收。本地方法棧和虛擬機棧差不多,只不過本地方法棧是為本地方法服務(wù)的。
7. 程序計數(shù)器的作用是什么?
記錄程序執(zhí)行的位置,程序調(diào)用別的方法、循環(huán)、遞歸的時候,下一次要回到哪兒執(zhí)行,就靠程序計數(shù)器記錄。
8. 方法區(qū)是物理上的劃分嗎?
方法區(qū)是用來存儲類加載器生成的類的結(jié)構(gòu)信息的,它是邏輯上的劃分,是一種規(guī)范,并不是具體的實現(xiàn)。jdk1.7 對方法區(qū)的實現(xiàn)叫做永久代,它存在于堆內(nèi)存中;jdk1.8 對方法區(qū)的實現(xiàn)叫元空間,它共用物理內(nèi)存。
9. 你對堆內(nèi)存了解多少?
堆是 JVM 中最大的一塊區(qū)域,存放數(shù)組以及對象。它又分為新生代、老年代,內(nèi)存占比是 1:2 。新生代又分為伊甸園區(qū)、from 區(qū)和 to 區(qū),這三塊區(qū)域內(nèi)存占比為 8:1:1 。對象在新生代的伊甸園區(qū)出生,經(jīng)歷了若干次垃圾回收達到了年齡的對象就會存放到老年代。
掃描二維碼