JVM相關(guān)面試題及答案(小結(jié))

1. 類的實(shí)例化順序,比如父類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,子類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,他們的執(zhí)行順序
答:先靜態(tài)、先父后子。
先靜態(tài):父靜態(tài) > 子靜態(tài)
優(yōu)先級(jí):父類 > 子類 靜態(tài)代碼塊 > 非靜態(tài)代碼塊 > 構(gòu)造函數(shù)
一個(gè)類的實(shí)例化過(guò)程:
1,父類中的static代碼塊,當(dāng)前類的static
2,順序執(zhí)行父類的普通代碼塊
3,父類的構(gòu)造函數(shù)
4,子類普通代碼塊
5,子類(當(dāng)前類)的構(gòu)造函數(shù),按順序執(zhí)行。
6,子類方法的執(zhí)行,
2. JVM內(nèi)存分配
3. Java 8的內(nèi)存分代改進(jìn)
從永久代到元空間,在小范圍自動(dòng)擴(kuò)展永生代避免溢出
4. JVM垃圾回收機(jī)制,何時(shí)觸發(fā)MinorGC等操作
分代垃圾回收機(jī)制:不同的對(duì)象生命周期不同。把不同生命周期的對(duì)象放在不同代上,不同代上采用最合適它的垃圾回收方式進(jìn)行回收。
JVM中共劃分為三個(gè)代:年輕代、年老代和持久代,
年輕代:存放所有新生成的對(duì)象;
年老代:在年輕代中經(jīng)歷了N次垃圾回收仍然存活的對(duì)象,將被放到年老代中,故都是一些生命周期較長(zhǎng)的對(duì)象;
持久代:用于存放靜態(tài)文件,如Java類、方法等。
新生代的垃圾收集器命名為“minor gc”,老生代的GC命名為”Full Gc 或者M(jìn)ajor GC”.其中用System.gc()強(qiáng)制執(zhí)行的是Full Gc.
判斷對(duì)象是否需要回收的方法有兩種:
1.引用計(jì)數(shù)
當(dāng)某對(duì)象的引用數(shù)為0時(shí),便可以進(jìn)行垃圾收集。
2.對(duì)象引用遍歷
果某對(duì)象不能從這些根對(duì)象的一個(gè)(至少一個(gè))到達(dá),則將它作為垃圾收集。在對(duì)象遍歷階段,gc必須記住哪些對(duì)象可以到達(dá),以便刪除不可到達(dá)的對(duì)象,這稱為標(biāo)記(marking)對(duì)象。
觸發(fā)GC(Garbage Collector)的條件:
1)GC在優(yōu)先級(jí)最低的線程中運(yùn)行,一般在應(yīng)用程序空閑即沒(méi)有應(yīng)用線程在運(yùn)行時(shí)被調(diào)用。
2)Java堆內(nèi)存不足時(shí),GC會(huì)被調(diào)用。
5. jvm中一次完整的GC流程(從ygc到fgc)是怎樣的,重點(diǎn)講講對(duì)象如何晉升到老年代等
答:對(duì)象優(yōu)先在新生代區(qū)中分配,若沒(méi)有足夠空間,Minor GC;
大對(duì)象(需要大量連續(xù)內(nèi)存空間)直接進(jìn)入老年態(tài);長(zhǎng)期存活的對(duì)象進(jìn)入老年態(tài)。如果對(duì)象在新生代出生并經(jīng)過(guò)第一次MGC后仍然存活,年齡+1,若年齡超過(guò)一定限制(15),則被晉升到老年態(tài)。
6. 你知道哪幾種垃圾收集器,各自的優(yōu)缺點(diǎn),重點(diǎn)講下cms,g1
7. Eden和Survivor的比例分配等
默認(rèn)比例8:1。
大部分對(duì)象都是朝生夕死。
復(fù)制算法的基本思想就是將內(nèi)存分為兩塊,每次只用其中一塊,當(dāng)這一塊內(nèi)存用完,就將還活著的對(duì)象復(fù)制到另外一塊上面。復(fù)制算法不會(huì)產(chǎn)生內(nèi)存碎片。
8. 深入分析了Classloader,雙親委派機(jī)制
ClassLoader:類加載器(class loader)用來(lái)加載 Java 類到 Java 虛擬機(jī)中。Java 源程序(.java 文件)在經(jīng)過(guò) Java 編譯器編譯之后就被轉(zhuǎn)換成 Java 字節(jié)代碼(.class 文件)。類加載器負(fù)責(zé)讀取 Java 字節(jié)代碼,并轉(zhuǎn)換成 java.lang.Class 類的一個(gè)實(shí)例。
雙親委派機(jī)制:某個(gè)特定的類加載器在接到加載類的請(qǐng)求時(shí),首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;只有父類加載器無(wú)法完成此加載任務(wù)時(shí),才自己去加載。
9. JVM的編譯優(yōu)化
10. 對(duì)Java內(nèi)存模型的理解,以及其在并發(fā)中的應(yīng)用
Java內(nèi)存模型的主要目標(biāo): 定義程序中各個(gè)變量的訪問(wèn)規(guī)則。
Java線程之間的通信由Java內(nèi)存模型(本文簡(jiǎn)稱為JMM)控制。
所有變量的存儲(chǔ)都在主內(nèi)存,每條線程還都有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝,線程對(duì)變量的所有操作必須在工作內(nèi)存完成,而不能直接讀取主內(nèi)存中的變量。不同的線程直接無(wú)法訪問(wèn)對(duì)方工作內(nèi)存中的變量,線程間變量的傳遞均需要通過(guò)主內(nèi)存來(lái)完成。
線程間通信:
1. 首先,線程A把本地內(nèi)存A中更新過(guò)的共享變量刷新到主內(nèi)存中去。
2. 然后,線程B到主內(nèi)存中去讀取線程A之前已更新過(guò)的共享變量。
11. 指令重排序,內(nèi)存柵欄等
指令重排序:編譯器或運(yùn)行時(shí)環(huán)境為了優(yōu)化程序性能而采取的對(duì)指令進(jìn)行重新排序執(zhí)行的一種手段。在單線程程序中,對(duì)存在控制依賴的操作重排序,不會(huì)改變執(zhí)行結(jié)果;但在多線程程序中,對(duì)存在控制依賴的操作重排序,可能會(huì)改變程序的執(zhí)行結(jié)果。
12. OOM錯(cuò)誤,stackoverflow錯(cuò)誤,permgen space錯(cuò)誤
13. JVM常用參數(shù)
JVM主要參數(shù):堆設(shè)置、回收器選擇(串行、并行、并發(fā)收集器)
14. tomcat結(jié)構(gòu),類加載器流程
目錄結(jié)構(gòu):
• /bin:存放windows或Linux平臺(tái)上啟動(dòng)和關(guān)閉Tomcat的腳本文件
• /conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml
• /doc:存放Tomcat文檔
• /server:包含三個(gè)子目錄:classes、lib和webapps
• /server/lib:存放Tomcat服務(wù)器所需的各種JAR文件
• /server/webapps:存放Tomcat自帶的兩個(gè)WEB應(yīng)用admin應(yīng)用和 manager應(yīng)用
• /common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問(wèn)的jar文件
• /shared/lib:存放所有web應(yīng)用都可以訪問(wèn)的jar文件(但是不能被Tomcat服務(wù)器訪問(wèn))
• /logs:存放Tomcat執(zhí)行時(shí)的日志文件
• /src:存放Tomcat的源代碼
• /webapps:Tomcat的主要Web發(fā)布目錄,默認(rèn)情況下把Web應(yīng)用文件放于此目錄
• /work:存放JSP編譯后產(chǎn)生的class文件
類加載器模式,雙親委派模式:
15. volatile的語(yǔ)義,它修飾的變量一定線程安全嗎
一個(gè)變量被定義為volatile之后,具備兩重語(yǔ)義:①保證此變量對(duì)所有線程的可見(jiàn)性,即當(dāng)一條線程修改了這個(gè)值,新值對(duì)于其他所有線程來(lái)說(shuō)是立即得知的,普通變量需要通過(guò)主內(nèi)存?zhèn)鬟f。②禁止指令重排序優(yōu)化。
Volatile修飾的變量不一定是線程安全的,eg非原子操作a++等
16. g1和cms區(qū)別,吞吐量?jī)?yōu)先和響應(yīng)優(yōu)先的垃圾收集器選擇
CMS收集器:一款以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的,分為4個(gè)步驟:初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記、并發(fā)清除。
G1收集器:面向服務(wù)端應(yīng)用的垃圾收集器,過(guò)程:初始標(biāo)記;并發(fā)標(biāo)記;最終標(biāo)記;篩選回收。整體上看是“標(biāo)記-整理”,局部看是“復(fù)制”,不會(huì)產(chǎn)生內(nèi)存碎片。
吞吐量?jī)?yōu)先的并行收集器:以到達(dá)一定的吞吐量為目標(biāo),適用于科學(xué)技術(shù)和后臺(tái)處理等。
響應(yīng)時(shí)間優(yōu)先的并發(fā)收集器:保證系統(tǒng)的響應(yīng)時(shí)間,減少垃圾收集時(shí)的停頓時(shí)間。適用于應(yīng)用服務(wù)器、電信領(lǐng)域等。
17. 說(shuō)一說(shuō)你對(duì)環(huán)境變量classpath的理解?如果一個(gè)類不在classpath下,為什么會(huì)拋出ClassNotFoundException異常,如果在不改變這個(gè)類路徑的前期下,怎樣才能正確加載這個(gè)類?
classpath是javac編譯器的一個(gè)環(huán)境變量。它的作用與import、package關(guān)鍵字有關(guān)。package的所在位置,就是設(shè)置CLASSPATH當(dāng)編譯器面對(duì)import packag這個(gè)語(yǔ)句時(shí),它先會(huì)查找CLASSPATH所指定的目錄,并檢視子目錄java/util是否存在,然后找出名稱吻合的已編譯文件(.class文件)。如果沒(méi)有找到就會(huì)報(bào)錯(cuò)!
動(dòng)態(tài)加載包
18. 說(shuō)一下強(qiáng)引用、軟引用、弱引用、虛引用以及他們之間和gc的關(guān)系
強(qiáng)引用:new出的對(duì)象之類的引用,
只要強(qiáng)引用還在,永遠(yuǎn)不會(huì)回收
軟引用:引用但非必須的對(duì)象,內(nèi)存溢出異常之前,回收
弱引用:非必須的對(duì)象,對(duì)象能生存到下一次垃圾收集發(fā)生之前。
虛引用:對(duì)生存時(shí)間無(wú)影響,在垃圾回收時(shí)得到通知。
到此這篇關(guān)于JVM相關(guān)面試題及答案(小結(jié))的文章就介紹到這了,更多相關(guān)JVM面試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了10道JVM常見(jiàn)面試題解析(附答案),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)2020-09-04
2020面試阿里字節(jié)跳動(dòng)90%被問(wèn)到的JVM面試題附答案(史上最全)
這篇文章主要介紹了2020面試阿里字節(jié)跳動(dòng)90%被問(wèn)到的JVM面試題附答案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-06-15- 這篇文章主要介紹了2020年JVM高頻率面試題整理,真是小編下了血本給大家整理出來(lái)的,值得大家收藏,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-09
- 這篇文章主要介紹了JVM面試題小結(jié)(2020最新版),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-02-21
- 這篇文章主要介紹了2019年JVM面試都問(wèn)了什么?(附答案解析),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-12-04
Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖
這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-16- JVM(Java 虛擬機(jī))算是面試必問(wèn)的問(wèn)題的了,而但凡問(wèn) JVM 一定會(huì)問(wèn)的第一個(gè)問(wèn)題就是:講一講 JVM 的組成?那本文就注重講一下 JVM 的組成,感興趣的可以了解一下2019-04-10
- 這篇文章主要介紹了30道有趣的JVM面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-11-26