)
第67篇JVM面試壓軸題2026版系列導航《Java 100 天進階之路》完整目錄 |?? 上一篇第66篇JIT編譯與性能優化 |?? 下一篇第68篇JavaWeb核心技術之Servlet待發布? 本文閱讀地圖3 分鐘速覽第61~66篇完成了JVM調優專題的全部學習本篇是JVM專題收官之作。精選 35 道大廠高頻面試題覆蓋 7 大模塊每題配標準話術 加分回答模塊核心考點面試權重內存區域五大運行時區、堆與棧區別、元空間 vs 永久代?????垃圾回收GC算法、回收器選型、G1 vs ZGC?????GC調優調優流程、參數配置、日志分析????類加載器雙親委派、打破雙親委派、熱部署????JIT編譯分層編譯、逃逸分析、方法內聯???OOM排查泄漏類型、排查工具、MAT分析????調優實戰參數配置、容器化JVM、生產問題????一、JVM內存模型篇8題Q1JVM運行時數據區包含哪些區域JDK 8之后有什么變化答案五大區域——程序計數器、虛擬機棧、本地方法棧、堆、方法區。JDK 8核心變化方法區實現從永久代PermGen改為元空間Metaspace元空間使用本地內存而非JVM堆內存默認無上限受物理內存限制永久代受-XX:MaxPermSize限制。Q2堆和棧的區別答案堆Heap——所有線程共享存儲對象實例和數組GC管理線程共享OutOfMemoryError。棧Stack——每個線程私有存儲局部變量、方法參數、對象引用自動分配釋放線程私有StackOverflowError。Q3對象在堆內存中的分配流程答案新對象優先分配在Eden區Eden區滿時觸發Minor GC存活對象復制到Survivor區S0/S1每經歷一次GC且存活年齡1年齡達到15默認晉升到老年代大對象超過PretenureSizeThreshold直接進入老年代。加分可通過-XX:MaxTenuringThreshold調整晉升年齡閾值。Q4String s new String(“abc”) 創建了幾個對象答案2個。abc字面量在字符串常量池元空間中創建1個對象new String()在堆中創建1個對象。s引用存在虛擬機棧的局部變量表中。如果池中已有abc則只創建1個堆對象。Q5元空間和永久代的區別答案元空間Metaspace使用本地內存默認無上限受物理內存限制JDK 8使用。永久代PermGen在JVM堆內存中受-XX:MaxPermSize限制JDK 7及之前使用。JDK 8移除永久代引入元空間字符串常量池從永久代移至堆避免永久代OOM。加分元空間默認無上限可能導致本地內存耗盡生產建議配置-XX:MaxMetaspaceSize。Q6程序計數器PC Register的作用為什么不會OOM答案程序計數器記錄當前線程執行的字節碼指令地址或行號是JVM中唯一不會拋出OutOfMemoryError的內存區域。每個線程獨立擁有內存極小且固定。Q7棧幀中包含哪些內容答案棧幀包含四個部分——局部變量表方法參數和局部變量、操作數棧執行運算時的臨時數據、動態鏈接將符號引用轉為直接引用支持多態、方法返回地址方法執行完后的返回位置。Q8什么情況下會拋出StackOverflowError什么情況下會拋出OutOfMemoryError答案StackOverflowError——遞歸調用過深、方法調用層級超出棧容量-Xss可調棧大小。OutOfMemoryError: Java heap space——堆內存耗盡-Xmx過小或內存泄漏。OutOfMemoryError: Metaspace——元空間耗盡類加載過多或類加載器泄漏。OutOfMemoryError: unable to create new native thread——無法創建新線程線程數超系統限制。二、垃圾回收GC篇8題Q9對象如何判定為“垃圾”答案可達性分析算法——從GC Roots根對象出發向下搜索搜索路徑稱為引用鏈。不在引用鏈上的對象被判定為不可達可被回收。GC Roots包括虛擬機棧棧幀中的局部變量引用的對象、方法區中靜態屬性引用的對象、方法區中常量引用的對象、本地方法棧中JNI引用的對象。加分可達性分析需在安全點Safepoint執行所有線程暫停STW。Q10四種垃圾回收算法的特點算法原理優缺點適用區域復制算法分成兩塊存活對象復制到另一塊無碎片高效內存利用率50%年輕代標記-清除標記存活對象清除未標記無需移動對象有碎片老年代CMS標記-整理標記存活對象整理到一端無碎片移動開銷大老年代分代收集不同區域使用不同算法綜合優勢年輕代老年代Q11Minor GC、Major GC、Full GC的區別答案Minor GC——年輕代GCEden區滿時觸發STW短暫通常10ms。Major GC——老年代GCCMS或G1的Mixed GCSTW稍長。Full GC——整個堆元空間的GCSTW最長應盡量避免。Full GC頻繁通常意味著內存泄漏或堆不足。Q12垃圾回收器有哪些各版本默認是什么答案六款主要回收器——Serial單線程Client模式、Parallel多線程并行JDK 8默認、CMS并發JDK 14已移除、G1分區化JDK 9默認、ZGC著色指針讀屏障亞毫秒級、Shenandoah并發整理。JDK 8默認Parallel GCJDK 9默認G1 GC。加分ZGC在JDK 21引入分代ZGCCPU開銷降低內存占用更小。Q13G1 GC的核心設計思想答案G1將堆劃分為多個大小相等的Region默認2048個每個Region可扮演Eden、Survivor、Old或Humongous角色。通過Garbage-First策略優先回收垃圾最多的Region基于歷史數據建立停頓預測模型確保GC停頓時間不超過-XX:MaxGCPauseMillis設定值。Q14CMS為什么被淘汰答案CMS的缺陷——①內存碎片標記-清除算法不壓縮碎片嚴重②CPU敏感并發階段占用CPU資源③并發模式失敗老年代空間不足時降級為Serial Old④浮動垃圾并發清理時新產生的垃圾需下次處理。JDK 9廢棄JDK 14徹底移除。Q15ZGC為什么能實現亞毫秒級停頓答案ZGC利用著色指針在64位指針的高位存儲對象元數據配合讀屏障將大部分GC操作并發化。對象轉移時通過讀屏障攔截訪問實現零停頓的并發轉移。ZGC停頓時間1ms且不隨堆大小增長。Q16強引用、軟引用、弱引用、虛引用的區別答案強引用——new Object()永不回收除非不可達。軟引用——SoftReference內存不足時回收適合緩存。弱引用——WeakReferenceGC時立即回收適合WeakHashMap、ThreadLocal。虛引用——PhantomReference無法通過它獲取對象僅用于對象回收跟蹤如Cleaner。三、GC調優篇5題Q17GC調優的標準流程是什么答案四步閉環——①監控發現用jstat、VisualVM發現GC異常②分析根因分析GC日志用MAT定位內存泄漏③參數調整每次只改1-2個參數④驗證效果觀察GC指標變化穩定后固化配置。Q18G1 GC的核心調優參數有哪些答案-XX:MaxGCPauseMillis——目標停頓時間最核心默認200ms調低→GC更頻繁但單次更短。-XX:G1HeapRegionSize——Region大小1-32MB大對象多可調大。-XX:InitiatingHeapOccupancyPercent——觸發Mixed GC的堆占用閾值默認45%。-XX:G1ReservePercent——預留內存默認10%防止晉升失敗觸發FullGC。Q19頻繁FullGC的常見原因答案①內存泄漏靜態集合、ThreadLocal未remove②大對象直接進老年代PretenureSizeThreshold過小③老年代空間不足-Xmx過小④元空間不足類加載過多⑤顯式調用System.gc()-XX:DisableExplicitGC禁用。Q20吞吐量和延遲如何權衡答案吞吐量用戶代碼時間/(用戶代碼GC時間)延遲GC停頓時間。追求高吞吐→用Parallel GC適合批處理追求低延遲→用G1/ZGC適合Web/支付。兩者不可兼得。Q21容器環境JVM參數有什么特殊要求答案使用-XX:InitialRAMPercentage和-XX:MaxRAMPercentage替代固定-Xmx讓JVM感知容器內存限制。JDK 10默認開啟UseContainerSupport。推薦配置-XX:InitialRAMPercentage50.0 -XX:MaxRAMPercentage80.0。四、類加載器篇5題Q22雙親委派模型是什么答案類加載器收到加載請求先委派給父加載器父加載器無法加載時自己才嘗試加載。三層加載器——Bootstrap根加載器C實現Java中為null、Extension/Platform擴展加載器JDK 9改名Platform、Application應用加載器加載classpath。父加載器優先。Q23為什么要設計雙親委派模型答案①安全避免核心類庫被篡改自定義java.lang.String不會被加載②避免重復加載確保類的唯一性③隔離性不同類加載器加載的同名類被視為不同類型。Q24如何打破雙親委派模型答案重寫loadClass()方法不先調用父加載器。典型場景——Tomcat的WebappClassLoader優先自己加載WEB-INF/classes和WEB-INF/lib的類實現Web應用隔離。JDBC驅動加載Thread.currentThread().setContextClassLoader()也打破了雙親委派。Q25兩個類加載器加載的同一個類能互相轉換嗎答案不能。即使類名相同不同類加載器加載的類在JVM中視為不同的類型強轉拋ClassCastException。JVM中類唯一標識是“類加載器全限定名”。Q26熱部署的原理是什么答案用新的類加載器重新加載目標類替換舊的引用。舊類加載器在沒有引用后會被GC回收實現不停機更新。關鍵點①確保舊實例沒有任何引用鏈可達②新舊類不混用③通過接口調用避免類型轉換沖突。五、JIT編譯篇3題Q27什么是JIT編譯器答案JITJust-In-Time在運行時將熱點字節碼編譯為本地機器碼并緩存后續直接執行機器碼。啟動時解釋執行保啟動速度運行中JIT持續優化熱點代碼。Java因此**“越跑越快”** 。Q28分層編譯的5個層級是什么答案0層解釋執行1層C1無profile編譯2層C1有限profile編譯3層C1全量profile編譯采集運行時數據4層C2極致優化編譯。代碼從0層開始熱度上升后逐級晉升到4層。Q29逃逸分析能帶來哪些優化答案逃逸分析判斷對象是否逃逸出方法或線程。基于分析結果可實現①棧上分配不逃逸對象在棧上減輕GC②標量替換對象拆散為基本類型變量③鎖消除單線程鎖直接移除。六、OOM與工具篇4題Q30OOM有哪幾種常見類型答案①Java heap space——堆內存溢出最常見內存泄漏或-Xmx過小②Metaspace——元空間溢出類加載過多、類加載器泄漏③Direct buffer memory——直接內存溢出NIO/Netty使用④GC overhead limit exceeded——GC回收98%內存卻騰不出空間基本等于內存泄漏⑤unable to create new native thread——線程數超系統限制。Q31生產環境OOM排查的標準流程答案①看日志確認OOM類型②jstat監控GC狀態③jmap dump生成堆快照或配置-XX:HeapDumpOnOutOfMemoryError自動dump④MAT深度分析堆快照定位泄漏根源⑤修復代碼并驗證。Q32常用的OOM排查工具答案jstat實時GC監控、jmap生成堆快照會STW、MAT深度泄漏分析最專業、VisualVM可視化監控、Arthas生產在線診斷阿里開源。生產必須開啟-XX:HeapDumpOnOutOfMemoryError自動dump。Q33如何防止OOM發生答案①生產開啟-XX:HeapDumpOnOutOfMemoryError②開啟GC日志③合理設置-Xmx和-Xms④代碼避免靜態集合無限增長、資源及時關閉、ThreadLocal及時remove⑤定期壓測和review。 面試官追問陷阱加分題追問1“MAT分析堆快照時Path to GC Roots為什么要排除弱引用和軟引用” 弱引用WeakReference和軟引用SoftReference在GC時會被回收不會造成內存泄漏。只有強引用鏈才是泄漏的根本原因。排除弱/軟/虛引用后留下的是真正的泄漏根源。追問2“-Xms和-Xmx設置相同有什么好處和壞處” 好處避免JVM動態擴容的STW開銷提高性能穩定性。壞處啟動時直接占用最大內存容器環境下可能浪費資源。生產通常建議設置相同如-Xms4g -Xmx4g避免擴容帶來的性能抖動。追問3“JDK 11的-XX:UseContainerSupport默認開啟有什么作用” 讓JVM感知容器內存限制使用-XX:MaxRAMPercentage代替固定-Xmx。容器內存超限時JVM不會因超出容器限制而被K8s殺死同時避免OOM。七、練習題分析題一個服務頻繁FullGC老年代使用率持續98%FGC每小時幾百次。可能是什么原因如何排查場景題某應用需要不停機更新代碼但每次熱部署后Metaspace持續增長最終OOM。分析原因和解決方案。代碼題寫出生產環境JVM參數要求堆4GB、開啟G1、目標停頓100ms、OOM自動dump、開啟GC日志輪轉。 你的學習進度當前第67篇 / 共108篇 ·進階篇JVM調優與故障排查第61~70篇? 已完成基礎篇44篇 第45~67篇 正在學第67篇? 待學習第68~108篇 完整目錄 學習指南 | 訂閱本專欄不錯過每一篇 下一篇文章預告下一篇《第68篇JavaWeb核心技術之Servlet》內容簡介Servlet生命周期、容器原理、Filter過濾器、Listener監聽器、Servlet 3.0異步處理、與Spring MVC的關系。JVM調優專題正式收官JavaWeb專題即將開啟《Java 100 天進階之路 | 從入門到上崗就業》每天一篇建議收藏 關注一起100天拿offer 點擊關注我更新后第一時間收到推送