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++指針