JVM 面試問題,背完去面試(面試篇 一)

首先聲明,該博客用於對JVM有了解的人,本文也是根據B站某班的老師講的內容,進行了總結。將概念理論,大家自己去查找,我也可以發你地址(很多視頻,不說講的不好,實在是在摸魚,純粹浪費時間,而有些博客寫的實在是看不下去,還是錯的)。

基於我自己的理解,做了一些簡單的總結,你可以背完去面試,但是不建議。很多東西你得有自己的認識,下面涉及的很多概念,都需要一定的基礎。內容是用MarkDown寫的複製進來的,它自己識別了,textarea還不挺不錯的。


- 談談你對JVM的認識。題目很大,等於沒問
1. 首先,JVM(Java Virtual Machine)java虛擬機,但是也不能說只能運行Java程序。JVM其實是運行字節碼文件的平臺,kotlin,Croovy都可以。
編譯成字節文件都可以在JVM上運行。HotSpot爲例,其實別的jvm虛擬機也得遵循規範。
2. 從java文件運行的過程進行分析,首先將java文件編譯成.class文件,由類加載器class_content,加載進內存,加載進方法區,方法區裏面有常量池和一些其他靜態變量屬性。
3. 方法區的實現,以前是永久代屬於堆。現在是元空間,直接物理內存控制,空間更大,不容易OOM。佔據20.75M ~ 1/32物理空間。
4. 在程序運行的過程中,有運行時數據區,裏面有常說的堆棧,程序計算器。棧分爲虛擬機棧,本地方法棧JNI(以前寫安卓的時候調用過,寫後臺就沒有用了)。
5. 在虛擬機棧中,當前線程通過將變量壓入局部表,操作數棧控制變量的執行過程,程序計數器記錄了程序的執行位置索引。
6. 假設當前線程存在子線程,會爲每個線程開闢一個棧幀的空間。當前的局部表和操作數棧的指針的索引,程序計算器會進行轉移,等到當前線程結束
纔會返回,程序計數器會有新的索引。棧幀裏面的動態鏈接堆裏面的對象new Obj(),棧存放了堆對象的索引。
7. 堆分爲新生代和年老代,新生代又有Eden區,From以及TO區,8:1:1,大部分對象在Eden區域就會被回收,四種對象的類型。開始垃圾回收。棧是不存在垃圾回收問題的。新老比例1:2,能夠合理的利用內存空間。
8. 垃圾回收算法
標記清除(基本不用了,浪費內存,細粒度空間),複製,標記整理,以及分代算法(整合前面三個),複製算法用在young裏面的From To,標記整理用在年老代
9. JVM調優
 選擇合適的垃圾收集器:Serial Parallel 串行 並行,JDK1.8默認Parallel Scavenge,保證吞吐量(codeT:cpuT),還有他們對應的Old。
 還有CMS(併發),以低停頓爲目的。多次標記過程
 目前的G1(電商裏面),能夠控制低停頓的時機,篩選回收機制。
 ZGC JDK11
10. 首先是指針壓縮,對象可以分爲對象有,實例數據區(我的理解爲棧區域),對齊填充區域。
 對象頭包括MarkDown8字節,類型指針(指針壓縮,線性地址),數組長度(對齊填充),然後實例數據區以及對齊填充。 
11. 字節碼文件的組成,magic minor margor 常量池,權限控制。接下來就是接口,屬性對象,屬性方法,以及屬性對照規範表和jclasslib可以分析Java代碼是如何運行的。
  調的是堆裏面的優,堆是線程共享
12. 一些常見的堆棧設置
   javac javap -XX:+PrintFlagsFinal Jinfo JStat VisualVM 分析等等
   vm options的配置 -Xss -Xms 等
13. OOM類型 Heap  Stack 常量池 直接內存溢出 四大類  
14.JVM調優的目的:
 增加吞吐量,減少停頓時間(CMS和G1)。查看日誌分析FullGC的存在,可是G1幾乎沒有FullGC,那你就去調試重新標記和刷選回收那塊。EasyGC工具。還有一些常用的指令。

本文也可能存在一定的錯誤,希望大家不吝賜教,謝謝!!!

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