1. 程式人生 > >虛擬機器效能監控理論和操作

虛擬機器效能監控理論和操作

虛擬機器效能監控與分析處理工具


JDK命令列工具:jdk \bin 路徑下,大多是jdk\lib\tools.jar類開的一層包裝
1.jps:列出正在執行的虛擬機器程序,顯示虛擬機器執行主類函式所在類的名稱,以及虛擬機器程序的唯一ID
如果同時啟動了多個虛擬機器,根基程序名稱不好區分,可以通過jps顯示主類的功能區分(jps -l)


2.jstat:監視各種執行狀態資訊,沒有圖形介面時,時執行期定位虛擬機器效能問題的首選(類載入,垃圾收集,執行期編譯狀況)
jstat -class,jstat -gc,jstat -compiler
jstat -gccause:查詢最近一次GC的原因


3.jinfo:實時檢視和調整虛擬機器各項引數(jps -v檢視虛擬機器啟動時顯示指定的引數,jinfo -flag檢視系統預設引數)


4.jmap:生成堆轉儲快照,查詢finalize執行佇列,java堆和永久代詳細資訊,哪種收集器等
也可以用-XX:+HeapDumpOnOutOfMemoryError引數,讓虛擬機器在OOM時自動生成轉儲檔案

jmap -histo顯示堆中物件統計資訊,類,例項數量

jmap -histo:live pid | more:


5.jhat:來分析jmap生成的堆轉儲快照(一般不用:比較簡陋,耗時耗資源)


6.jstack:生成虛擬機器當前時刻的執行緒快照:當前虛擬機器內每一條執行緒正在執行的方法堆疊集合。用來定位執行緒出現長時間停頓的原因

視覺化工具:

1.JConsole:zai JDK/bin目錄下啟動:jconsole.exe:自動搜尋本機執行的所有虛擬機器程序。
概述頁:顯示虛擬機器主要的執行資料概覽:堆記憶體,執行緒,類等
記憶體頁:監視收集器管理的虛擬機器記憶體(堆,永久代)的變化趨勢
執行緒監控:遇到執行緒停頓時使用:等待外部資源(資料庫,網路),死迴圈,鎖等待


2.VisualVM:多合一故障處理工具
方法級效能分析:找出被呼叫最多,執行時間最長的方法
生成和瀏覽堆轉儲快照
Profiler頁:程式執行期間方法級CPU執行時間分析,記憶體分析
BTrace動態日誌跟蹤:動態加入原本不存在的除錯程式碼。列印呼叫堆疊,引數,返回值。效能監視,定位連線洩漏,記憶體洩露,多執行緒競爭 等問題

調優案例:

1.高效能硬體:堆記憶體太大,一次Full GC耗時太長,從磁碟讀檔案到記憶體中,出現很多文件序列化的大物件,直接進入老年待。頻繁Full GC


使用多個32位虛擬機器建立邏輯叢集,(避免64位虛擬機器指標膨脹及資料型別對齊等消耗記憶體)
一臺物理機上啟動多個服務程序,分配不同埠,負載均衡。CPU敏感度較低:採用CMS收集器垃圾回收
注意:1.避免節點競爭全域性資源(磁碟IO)


2.叢集建同步導致記憶體溢位:資訊傳輸失敗重發,所有傳送資訊儲存在記憶體中,網路互動頻繁時 資料不斷堆積。


3.堆外記憶體溢位:
NIO操作需要用到Direct Memory 
JNI呼叫本地庫,使用的記憶體也不再堆中 不能像新生代和老年代一樣發現空間不足就通知收集器回收。只能等老年代滿了,Full GC時 順便 清理 

注意:-XX:MaxDirectMemorySize調整Direct Memory大小


4.外部命令導致CPU佔用率高:
Rumtime.getRuntime().exec():先克隆一個和當前虛擬機器一樣環境變數的程序,再用該程序執行外部命令,再推出該程序


5.伺服器JVM崩潰:
非同步方式呼叫Web服務:由於兩邊服務速度不等,時間久了,積累了很多Web服務沒有呼叫完,導致在等待的執行緒和Socket連線很多。虛擬機器 崩潰。

注意:非同步呼叫改成 生產者/消費者模式的訊息佇列實現

tips:

java為了實現跨平臺,java程式碼編譯形成Class檔案儲存的是位元組碼ByteCode,虛擬機器通過解釋當時執行位元組碼命令。比起C/C++編譯成本地二進位制
很慢。所以有了JIT編譯器



編譯時間是指虛擬機器的JIT編譯器 編譯熱點程式碼的耗時。
可以使用虛擬機器引數:-Xint禁止編譯器工作。


發生一次垃圾收集,使用者執行緒需跑到最近的一個安全點,掛起執行緒等待垃圾回收


要求虛擬機器生成GC日誌:-XX:+PrintGCTimeStamps(GC停頓時間)
-XX:+PrintGCDetails(GC詳細資訊)
-XX:+DisableExplicitGC遮蔽System.gc()

對於與使用者互動頻繁的應用,使用CMS收集器:-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction 設定CMS老年代發生Full GC的記憶體使用值