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漠酿,加載用戶編寫的類;還可以繼承 ClassLoader 類自定義類加載器佑女。Application ClassLoader 是 Extension ClassLoader 的子類记靡,Extension ClassLoader 又是 Bootstrap ClassLoader 的子類。
4. 什么是雙親委派機(jī)制团驱?
- 簡單地說就是要加載類時(shí)先找自己的父類去進(jìn)行加載摸吠。比如要加載 A.class,首先 Application ClassLoader 會先找自己的父類嚎花,即 Extension ClassLoader寸痢,Extension ClassLoader 又會先找自己的父類,即 Bootstrap ClassLoader紊选,它沒加載到啼止,再告訴 Extension ClassLoader,它又沒加載到兵罢,才輪到 Application ClassLoader 去加載献烦。這就是雙親委派機(jī)制,可以保證優(yōu)先加載 JDK 自己的類卖词。
5. 類的加載過程是怎樣的巩那?
- 加載:將 class 文件加載進(jìn)內(nèi)存;
- 驗(yàn)證:驗(yàn)證 class 文件的正確性;
- 準(zhǔn)備:給類中的靜態(tài)變量分配空間即横;
- 解析:將 class 常量池中的符號引用替換成直接引用噪生;
- 初始化:對靜態(tài)變量和靜態(tài)代碼塊進(jìn)行初始化。
6. 說說你對棧內(nèi)存的認(rèn)識东囚?
- 棧內(nèi)存是線程私有的一塊區(qū)域播瞳,分為虛擬機(jī)棧和本地方法棧忍宋“澹基本類型的變量谬运、對象的引用變量和實(shí)例方法都是在棧中分配的肯夏。棧的內(nèi)存地址是連續(xù)的纽甘,不存在垃圾回收或杠。本地方法棧和虛擬機(jī)棧差不多谓形,只不過本地方法棧是為本地方法服務(wù)的钉跷。
7. 程序計(jì)數(shù)器的作用是什么弥鹦?
- 記錄程序執(zhí)行的位置,程序調(diào)用別的方法爷辙、循環(huán)彬坏、遞歸的時(shí)候,下一次要回到哪兒執(zhí)行膝晾,就靠程序計(jì)數(shù)器記錄栓始。
8. 方法區(qū)是物理上的劃分嗎?
- 方法區(qū)是用來存儲類加載器生成的類的結(jié)構(gòu)信息的血当,它是邏輯上的劃分幻赚,是一種規(guī)范,并不是具體的實(shí)現(xiàn)臊旭。jdk1.7 對方法區(qū)的實(shí)現(xiàn)叫做永久代落恼,它存在于堆內(nèi)存中;jdk1.8 對方法區(qū)的實(shí)現(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)歷了若干次垃圾回收達(dá)到了年齡的對象就會存放到老年代。