前言
本來想著給自己放鬆一下,刷刷部落格,突然被幾道面試題難倒!調優命令有哪些?常見調優工具有哪些?Minor GC與Full GC分別在什麼時候發生?你知道哪些JVM效能調優引數(簡單版回答)?物件一定分配在堆中嗎?有沒有了解逃逸分析技術?似乎有點模糊了,那就大概看一下面試題吧。好記性不如爛鍵盤
*** 12萬字的java面試題整理 ***
調優命令有哪些?
Sun JDK監控和故障處理命令有jps jstat jmap jhat jstack jinfo
- jps,JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機器程序。
- jstat,JVM statistics Monitoring是用於監視虛擬機器執行時狀態資訊的命令,它可以顯示出虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料。
- jmap,JVM Memory Map命令用於生成heap dump檔案
- jhat,JVM Heap Analysis Tool命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內建了一個微型的HTTP/HTML伺服器,生成dump的分析結果後,可以在瀏覽器中檢視
- jstack,用於生成java虛擬機器當前時刻的執行緒快照。
- jinfo,JVM Configuration info 這個命令作用是實時檢視和調整虛擬機器執行引數。
常見調優工具有哪些
常用調優工具分為兩類,jdk自帶監控工具:jconsole和jvisualvm,第三方有:MAT(MemoryAnalyzer Tool)、GChisto。
- jconsole,Java Monitoring and Management Console是從java5開始,在JDK中自帶的java監控和管理控制檯,用於對JVM中記憶體,執行緒和類等的監控
- jvisualvm,jdk自帶全能工具,可以分析記憶體快照、執行緒快照;監控記憶體變化、GC變化等。
- MAT,Memory Analyzer Tool,一個基於Eclipse的記憶體分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查詢記憶體洩漏和減少記憶體消耗
- GChisto,一款專業分析gc日誌的工具
Minor GC與Full GC分別在什麼時候發生?
新生代記憶體不夠用時候發生MGC也叫YGC,JVM記憶體不夠的時候發生FGC
你知道哪些JVM效能調優引數?(簡單版回答)
- 設定堆記憶體大小
-Xmx:堆記憶體最大限制。 - 設定新生代大小。 新生代不宜太小,否則會有大量物件湧入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代佔比
-XX:SurvivorRatio:伊甸園空間和倖存者空間的佔比 - 設定垃圾回收器 年輕代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC21
物件一定分配在堆中嗎?有沒有了解逃逸分析技術?
「物件一定分配在堆中嗎?」
不一定的,JVM透過「逃逸分析」,那些逃不出方法的物件會在棧上分配。
「什麼是逃逸分析?」
逃逸分析(Escape Analysis),是一種可以有效減少Java 程式中同步負載和記憶體堆分配壓力的跨函式全域性資料流分析演算法。透過逃逸分析,Java Hotspot編譯器能夠分析出一個新的物件的引用的使用範圍,從而決定是否要將這個物件分配到堆上。
逃逸分析是指分析指標動態範圍的方法,它同編譯器最佳化原理的指標分析和外形分析相關聯。當變數(或者物件)在方法中分配後,其指標有可能被返回或者被全域性引用,這樣就會被其他方法或者執行緒所引用,這種現象稱作指標(或者引用)的逃逸(Escape)。通俗點講,如果一個物件的指標被多個方法或者執行緒引用時,那麼我們就稱這個物件的指標發生了逃逸。
「逃逸分析的好處」
- 棧上分配,可以降低垃圾收集器執行的頻率。
- 同步消除,如果發現某個物件只能從一個執行緒可訪問,那麼在這個物件上的操作可以不需要同步。
- 標量替換,把物件分解成一個個基本型別,並且記憶體分配不再是分配在堆上,而是分配在棧上。這樣的好處有,一、減少記憶體使用,因為不用生成物件頭。二、程式記憶體回收效率高,並且GC頻率也會減少