面試題總結(持更)

JVM

  • 什麼是jvm(一種規範)
  • 常見的jvm有哪些(HotSpot,Jrockit,J9,Microsoft VM,TaobaoVM,LiquidVM,azul zing)
  • class文件格式
  • class 加載過程(class->loading->linking(驗證->初始化默認值->解析)->initializing->using->gc)
  • 靜態變量的賦值過程(先默認後初始化)
  • 雙親委派機制是什麼,爲什麼要用雙親委派(安全)
  • 怎麼實現一個自定義的類加載器(extends ClassLoader overwrite findClass defineClass)
  • lazyloading(5種情況)
  • 解釋模式/JIT編譯模式(-Xmixed(檢測熱點代碼 -XX:CompileThreshold=10000),-Xint,-Xcomp)
  • 單例模式,指令重排問題
  • 現代CPU的數據一致性實現 = 緩存鎖(MESI ...) + 總線鎖
  • 讀取緩存以cache line爲基本單位,目前64bytes
  • 位於同一緩存行的兩個不同數據,被兩個不同CPU鎖定,產生互相影響的僞共享問題 僞共享問題:JUC/c_028_FalseSharing
  • 內存屏障,volatile實現細節
  • synchronized實現細節
  • 一個對象的創建過程(6大步)
  • 對象的內存分佈(對象頭,對象指針,實際數據,padding對齊;普通對象和數組對象的區別)
  • 對象定位(句柄池,直接指針(hotspot))
  • 對象的分配問題(棧->新生代->s->老年代)
  • jvm運行時內存模型
  • 方法區1.8前後的對比

GC

  • 什麼是垃圾
  • 如何定位垃圾
  • 那些是root對象(jvm棧,本地方法棧,運行時常量池,靜態變量)
  • 常見的垃圾回收算法
  • jvm內存分代模型
  • 對象分配過程
  •  常見的垃圾回收器
  • CMS的問題(浮動垃圾,PO備用(什麼時候)),CMS的閾值(1.8默認68%,之前92%)
  • CMS啓動的條件(老年代比例68%,怎麼去控制這個比例-XX:CMSInitiatingOccupancyFraction)
  • JVM調優流程
步驟:
  1. 熟悉業務場景(沒有最好的垃圾回收器,只有最合適的垃圾回收器)
     1. 響應時間、停頓時間 [CMS G1 ZGC] (需要給用戶作響應)
     2. 吞吐量 = 用戶時間 /( 用戶時間 + GC時間) [PS]
  2. 選擇回收器組合
  3. 計算內存需求(經驗值 1.5G 16G)
  4. 選定CPU(越高越好)
  5. 設定年代大小、升級年齡
  6. 設定日誌參數
     1. -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
     2. 或者每天產生一個日誌文件
  7. 觀察日誌情況
  • 系統CPU經常100%,如何調優?(面試高頻) CPU100%那麼一定有線程在佔用系統資源, 1. 找出哪個進程cpu高(top) 2. 該進程中的哪個線程cpu高(top -Hp) 3. 導出該線程的堆棧 (jstack) 4. 查找哪個方法(棧幀)消耗時間 (jstack) 5. 工作線程佔比高 | 垃圾回收線程佔比高
  • 系統內存飆高,如何查找問題?(面試高頻) 1. 導出堆內存 (jmap) 2. 分析 (jhat jvisualvm mat jprofiler ... )
  • 什麼是三色標記法,漏標是什麼
  • G1原理及算法(CSet,Rset,CardTable,Region概念)
  • G1和CMS算法區別(都使用了三色標記,解決漏標的方法不同;內存分區不同)
  • G1出現FGC的解決辦法
  • G1的缺點
  • G1的GC有幾種
  • 擴展-纖程

線程

  • 啓動線程的幾種方法
  • sleep,yield,join,interrupt
  • 線程的狀態

 

  • 如何保證線程安全
  • synchronized(可重入讀寫鎖,異常自動釋放,鎖升級(偏向鎖,自旋鎖10次,重量級鎖))
  • 什麼時候用自旋鎖(執行時間短,線程數少),什麼時候用os鎖(執行時間長,線程數多)
  • synchronized 不要鎖String常量和Integer,Long等基礎數據類型
  • volatile(保證線程可見性(底層是CPU的緩存一致性),禁止指令重排序(聯想class的彙編指令,使用jclasslib插件))
  • 單例模式雙重檢查是什麼,還需要volatile嗎?爲什麼?
  • synchronized鎖優化(粒度粗細)
  • 如果要鎖一個對象,需要把對象設爲final爲什麼?(鎖的原理,對象頭信息)
  • CAS
  • ABA問題(會出現在對象之間,加版本號解決)
  • Unsafe=c c++指針
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章