JVM面試經典(BAT必面)

1. 類的實例化順序,比如父類靜態數據,構造函數,字段,子類靜態數據,構造函數,字段,他們的執行順序

答:先靜態、先父後子。 
先靜態:父靜態 > 子靜態 
優先級:父類 > 子類 靜態代碼塊 > 非靜態代碼塊 > 構造函數 
一個類的實例化過程: 
1,父類中的static代碼塊,當前類的static 
2,順序執行父類的普通代碼塊 
3,父類的構造函數 
4,子類普通代碼塊 
5,子類(當前類)的構造函數,按順序執行。 
6,子類方法的執行,

2. JVM內存分配

 

 

3. Java 8的內存分代改進

從永久代到元空間,在小範圍自動擴展永生代避免溢出

4. JVM垃圾回收機制,何時觸發MinorGC等操作

分代垃圾回收機制:不同的對象生命週期不同。把不同生命週期的對象放在不同代上,不同代上採用最合適它的垃圾回收方式進行回收。 
JVM中共劃分爲三個代:年輕代、年老代和持久代, 
年輕代:存放所有新生成的對象; 
年老代:在年輕代中經歷了N次垃圾回收仍然存活的對象,將被放到年老代中,故都是一些生命週期較長的對象; 
持久代:用於存放靜態文件,如Java類、方法等。 
新生代的垃圾收集器命名爲“minor gc”,老生代的GC命名爲”Full Gc 或者Major GC”.其中用System.gc()強制執行的是Full Gc. 
判斷對象是否需要回收的方法有兩種: 
1.引用計數 
當某對象的引用數爲0時,便可以進行垃圾收集。 
2.對象引用遍歷 
果某對象不能從這些根對象的一個(至少一個)到達,則將它作爲垃圾收集。在對象遍歷階段,gc必須記住哪些對象可以到達,以便刪除不可到達的對象,這稱爲標記(marking)對象。

觸發GC(Garbage Collector)的條件: 
1)GC在優先級最低的線程中運行,一般在應用程序空閒即沒有應用線程在運行時被調用。 
2)Java堆內存不足時,GC會被調用。

5. jvm中一次完整的GC流程(從ygc到fgc)是怎樣的,重點講講對象如何晉升到老年代等

答:對象優先在新生代區中分配,若沒有足夠空間,Minor GC; 
大對象(需要大量連續內存空間)直接進入老年態;長期存活的對象進入老年態。如果對象在新生代出生並經過第一次MGC後仍然存活,年齡+1,若年齡超過一定限制(15),則被晉升到老年態。

6. 你知道哪幾種垃圾收集器,各自的優缺點,重點講下cms,g1

7. Eden和Survivor的比例分配等

默認比例8:1。 
大部分對象都是朝生夕死。 
複製算法的基本思想就是將內存分爲兩塊,每次只用其中一塊,當這一塊內存用完,就將還活着的對象複製到另外一塊上面。複製算法不會產生內存碎片。 
8. 深入分析了Classloader,雙親委派機制 
ClassLoader:類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。Java 源程序(.java 文件)在經過 Java 編譯器編譯之後就被轉換成 Java 字節代碼(.class 文件)。類加載器負責讀取 Java 字節代碼,並轉換成 java.lang.Class 類的一個實例。 
雙親委派機制:某個特定的類加載器在接到加載類的請求時,首先將加載任務委託給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

9. JVM的編譯優化

10. 對Java內存模型的理解,以及其在併發中的應用

Java內存模型的主要目標: 定義程序中各個變量的訪問規則。 
Java線程之間的通信由Java內存模型(本文簡稱爲JMM)控制。 
所有變量的存儲都在主內存,每條線程還都有自己的工作內存,線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝,線程對變量的所有操作必須在工作內存完成,而不能直接讀取主內存中的變量。不同的線程直接無法訪問對方工作內存中的變量,線程間變量的傳遞均需要通過主內存來完成。 


線程間通信: 
1. 首先,線程A把本地內存A中更新過的共享變量刷新到主內存中去。 
2. 然後,線程B到主內存中去讀取線程A之前已更新過的共享變量。

11. 指令重排序,內存柵欄等

指令重排序:編譯器或運行時環境爲了優化程序性能而採取的對指令進行重新排序執行的一種手段。在單線程程序中,對存在控制依賴的操作重排序,不會改變執行結果;但在多線程程序中,對存在控制依賴的操作重排序,可能會改變程序的執行結果。

12. OOM錯誤,stackoverflow錯誤,permgen space錯誤

13. JVM常用參數

JVM主要參數:堆設置、回收器選擇(串行、並行、併發收集器)

14. tomcat結構,類加載器流程 


 
目錄結構: 
• /bin:存放windows或Linux平臺上啓動和關閉Tomcat的腳本文件 
• /conf:存放Tomcat服務器的各種全局配置文件,其中最重要的是server.xml和web.xml 
• /doc:存放Tomcat文檔 
• /server:包含三個子目錄:classes、lib和webapps 
• /server/lib:存放Tomcat服務器所需的各種JAR文件 
• /server/webapps:存放Tomcat自帶的兩個WEB應用admin應用和 manager應用 
• /common/lib:存放Tomcat服務器以及所有web應用都可以訪問的jar文件 
• /shared/lib:存放所有web應用都可以訪問的jar文件(但是不能被Tomcat服務器訪問) 
• /logs:存放Tomcat執行時的日誌文件 
• /src:存放Tomcat的源代碼 
• /webapps:Tomcat的主要Web發佈目錄,默認情況下把Web應用文件放於此目錄 
• /work:存放JSP編譯後產生的class文件

15.類加載器模式,雙親委派模式


16. volatile的語義,它修飾的變量一定線程安全嗎

一個變量被定義爲volatile之後,具備兩重語義:①保證此變量對所有線程的可見性,即當一條線程修改了這個值,新值對於其他所有線程來說是立即得知的,普通變量需要通過主內存傳遞。②禁止指令重排序優化。 
Volatile修飾的變量不一定是線程安全的,eg非原子操作a++等

17. g1和cms區別,吞吐量優先和響應優先的垃圾收集器選擇

CMS收集器:一款以獲取最短回收停頓時間爲目標的收集器,是基於“標記-清除”算法實現的,分爲4個步驟:初始標記、併發標記、重新標記、併發清除。 
G1收集器:面向服務端應用的垃圾收集器,過程:初始標記;併發標記;最終標記;篩選回收。整體上看是“標記-整理”,局部看是“複製”,不會產生內存碎片。 
吞吐量優先的並行收集器:以到達一定的吞吐量爲目標,適用於科學技術和後臺處理等。 
響應時間優先的併發收集器:保證系統的響應時間,減少垃圾收集時的停頓時間。適用於應用服務器、電信領域等。

18. 說一說你對環境變量classpath的理解?如果一個類不在classpath下,爲什麼會拋出ClassNotFoundException異常,如果在不改變這個類路徑的前期下,怎樣才能正確加載這個類?

classpath是javac編譯器的一個環境變量。它的作用與import、package關鍵字有關。package的所在位置,就是設置CLASSPATH當編譯器面對import packag這個語句時,它先會查找CLASSPATH所指定的目錄,並檢視子目錄java/util是否存在,然後找出名稱吻合的已編譯文件(.class文件)。如果沒有找到就會報錯! 
動態加載包

19. 說一下強引用、軟引用、弱引用、虛引用以及他們之間和gc的關係

強引用:new出的對象之類的引用, 
只要強引用還在,永遠不會回收 
軟引用:引用但非必須的對象,內存溢出異常之前,回收 
弱引用:非必須的對象,對象能生存到下一次垃圾收集發生之前。 
虛引用:對生存時間無影響,在垃圾回收時得到通知。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章