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

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