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