Jprofile解析dump文件使用詳解

1 Jprofile簡介

在這裏插入圖片描述

  • 下載對應的系統版本便可

性能查看工具JProfiler,可用於查看java執行效率,查看線程狀態,查看內存佔用與內存對象,還能夠分析dump日誌.html

2 功能簡介

  • 選擇attach to a locally running jvm

  • 選擇須要查看運行的jvm,雙擊或者點擊start

  • 等待進度完成,彈出模式選擇

  • Instrumentation模式記錄全部的信息。包括方法執行次數等Sampling模式則只支持部分功能,不紀錄方法調用次數等,而且更爲安全

因爲紀錄信息不少,java運行會變的比正常執行慢不少,sampling模式則不會java

- 常規使用選擇sampling模式便可,當須要調查方法執行次數才須要選擇Instrumentation模式,模式切換須要重啓jprofiler
  • 點擊OK

  • 選擇Live Momory能夠查看內存中的對象和大小

  • 選擇cpu views點擊下圖框中的按鈕來紀錄cpu的執行時間

  • 這時候能夠在外部對須要錄的jvm操做進行記錄了,得出的結果能夠輕鬆看出方法執行調用過程與消耗時間比例:
  • 根據cpu截圖的信息,能夠找到效率低的地方進行處理,若是是Instrumentation模式則在時間位置會顯示調用次數

在Thread界面則能夠實時查看線程運行狀態,黃色的是wait 紅色是block 綠色的是runnable藍色是網絡和I/O請求狀態
segmentfault

選擇ThreadDumps,能夠錄製瞬時線程的調用堆棧信息,以下圖所示:
windows

3 dump 文件分析

3.1 dump 生成

JProfiler 在線

當JProfiler鏈接到JVM以後選擇Heap Walker,選擇Take snapshot圖標,而後等待便可


若是內存很大,jprofiler萬一參數設置的不正確打不開就須要要從新生成,內存小的時候無所謂數組

使用JProfiler生成文件

當JProfiler鏈接到JVM以後選擇菜單上的Profiling->save HPROF snapshot 彈出下拉框保存便可,這時候生成的文件就能夠一直保存在文件上tomcat

jmap

jmap -dump:format=b,file=文件名 pid

windows下不用[],路徑要加引號

jmap -dump:format=b,file="D:\a.dump" 8632

命令中文件名就是要保存的dump文件路徑, pid就是當前jvm進程的id安全

JVM啓動參數

在發生outofmemory的時候自動生成dump文件:bash

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump

Pah後面是一個存在的可訪問的路徑,將改參數放入jvm啓動參數能夠在發生內存outofmemory的時候自動生成dump文件,可是正式環境使用的時候不要加這個參數,否則在內存快滿的時候老是會生成dump而致使jvm卡半天,須要調試的時候才須要加這個參數網絡

注意:經過WAS生成的PHD文件dump不能分析出出問題的模板,由於PHD文件不包含對象的值內容,沒法根據PHD文件找到出問題的模板,因此PHD文件沒有太大的參考價值jvm

3.2 dump文件分析

dump文件生成後,將dump壓縮傳輸到本地,無論當前dump的後綴名是什麼,直接改爲*.hprof,就能夠直接用jprofiler打開了

打開的過程時間可能會很長,主要是要對dump進行預處理,計算什麼的,注意 這個過程不能點skip,不然就不太好定位大文件

  • 直接打開.hprof文件

  • 注意以下過程,中途能夠喝一杯☕️,不要做死手滑點擊了 skip!







這樣界面的時候下面能夠開始進行操做了!

4 模塊功能點詳解

也可使用工具欄中的「轉到開始」按鈕訪問第一個數據集

4.1 內存視圖 Memory Views

JProfiler的內存視圖部分能夠提供動態的內存使用情況更新視圖和顯示關於內存分配情況信息的視圖。全部的視圖都有幾個彙集層而且可以顯示現有存在的對象和做爲垃圾回收的對象。

  • 全部對象 All Objects

顯示類或在情況統計和尺碼信息堆上全部對象的包。你能夠標記當前值並顯示差別值。

  • 記錄對象 Record Objects

顯示類或全部已記錄對象的包。你能夠標記出當前值而且顯示差別值。

  • 分配訪問樹 Allocation Call Tree

顯示一棵請求樹或者方法、類、包或對已選擇類有帶註釋的分配信息的J2EE組件。

  • 分配熱點 Allocation Hot Spots

顯示一個列表,包括方法、類、包或分配已選類的J2EE組件。你能夠標註當前值而且顯示差別值。對於每一個熱點均可以顯示它的跟蹤記錄樹。

  • 類追蹤器 Class Tracker

類跟蹤視圖能夠包含任意數量的圖表,顯示選定的類和包的實例與時間。

4.2 堆遍歷 Heap Walker

使用背景

在視圖中找到增加快速的對象類型,在memory視圖中找到Concurrenthashmap---點右鍵----選擇「Show Selectiion In Heap Walker」,切換到HeapWarker 視圖;切換前會彈出選項頁面,注意必定要選擇「Select recorded objects」,這樣Heap Walker會在剛剛的那段記錄中進行分析;不然,會分析tomcat的全部內存對象,這樣既耗時又不許確;

在JProfiler的堆遍歷器(Heap Walker)中,你能夠對堆的情況進行快照而且能夠經過選擇步驟下尋找感興趣的對象。堆遍歷器有五個視圖:

  • 類 Classes

顯示全部類和它們的實例,能夠右擊具體的類"Used Selected Instance"實現進一步跟蹤。

  • 分配 Allocations

爲全部記錄對象顯示分配樹和分配熱點。

  • 索引 References

爲單個對象和「顯示到垃圾回收根目錄的路徑」提供索引圖的顯示功能。還能提供合併輸入視圖和輸出視圖的功能。

  • 時間 Time

顯示一個對已記錄對象的解決時間的柱狀圖。

  • 檢查 Inspections

顯示了一個數量的操做,將分析當前對象集在某種條件下的子集,實質是一個篩選的過程。

在HeapWalker中,找到泄漏的對象

HeapWarker 會分析內存中的全部對象,包括對象的引用、建立、大小和數量.
經過切換到References頁籤,能夠看到這個類的具體對象實例。 爲了在這些內存對象中,找到泄漏的對象(應該被回收),能夠在該對象上點擊右鍵,選擇「Use Selected Instances」縮小對象範圍

經過引用分析該對象

References 能夠看到該對象的的引用關係,選項顯示引用的類型

  • incoming

顯示這個對象被誰引用

  • outcoming

顯示這個對象引用的其餘對象

選擇「Show In Graph」將引用關係使用圖形方式展示;

  • 選中該對象,點擊Show Paths To GC Root,會找到引用的根節點

經過建立分析該對象

若是還不能定位內存泄露的地方,咱們能夠嘗試使用Allocations頁籤,該頁籤顯示對象是如何建立出來的;
咱們能夠從建立方法開始檢查,檢查全部用到該對象的地方,直到找到泄漏位置;

圖表 Graph

你須要在references視圖和biggest視圖手動添加對象到圖表,它能夠顯示對象的傳入和傳出引用,能方便的找到垃圾收集器根源。

tips:在工具欄點擊"Go To Start"可使堆內存從新計數,也就是回到初始狀態。

  

CPU 視圖 CPU Views

  JProfiler 提供不一樣的方法來記錄訪問樹以優化性能和細節。線程或者線程組以及線程情況能夠被全部的視圖選擇。全部的視圖均可以彙集到方法、類、包或J2EE組件等不一樣層上。CPU視圖部分包括:

  

訪問樹 Call Tree
顯示一個積累的自頂向下的樹,樹中包含全部在JVM中已記錄的訪問隊列。JDBC,JMS和JNDI服務請求都被註釋在請求樹中。請求樹能夠根據Servlet和JSP對URL的不一樣須要進行拆分。
熱點 Hot Spots
顯示消耗時間最多的方法的列表。對每一個熱點都可以顯示回溯樹。該熱點能夠按照方法請求,JDBC,JMS和JNDI服務請求以及按照URL請求來進行計算。
訪問圖 Call Graph
顯示一個從已選方法、類、包或J2EE組件開始的訪問隊列的圖。
方法統計 Method Statistis
顯示一段時間內記錄的方法的調用時間細節。

線程視圖 Thread Views

  JProfiler經過對線程歷史的監控判斷其運行狀態,並監控是否有線程阻塞產生,還能將一個線程所管理的方法以樹狀形式呈現。對線程剖析,JProfiler提供如下視圖:

  

線程歷史 Thread History
顯示一個與線程活動和線程狀態在一塊兒的活動時間表。
線程監控 Thread Monitor
顯示一個列表,包括全部的活動線程以及它們目前的活動情況。
線程轉儲 Thread Dumps
顯示全部線程的堆棧跟蹤。

監控器視圖 Monitor Views

  JProfiler提供了不一樣的監控器視圖,以下所示:

  

當前鎖定圖表 Current Locking Graph
顯示JVM中的當前鎖定狀況。
當前監視器 Current Monitors
顯示當前正在等待或阻塞中的線程操做。
鎖定歷史圖表 Locking History Graph
顯示記錄在JVM中的鎖定歷史。
監控器歷史 Monitor History
顯示等待或者阻塞的歷史。
監控器使用統計 Monitor Usage Statistics
計算統計監控器監控的數據。

VM遙感勘測技術視圖 VM Telemetry Views

  觀察JVM的內部狀態,JProfiler提供了不一樣的遙感勘測視圖,以下所示:

  

內存 Memory
顯示堆棧的使用情況和堆棧尺寸大小活動時間表。
記錄的對象 Recorded Objects
顯示一張關於活動對象與數組的圖表的活動時間表。
記錄的生產量 Recorded Throughput
顯示一段時間累計的JVM生產和釋放的活動時間表。
垃圾回收活動 GC Activity
顯示一張關於垃圾回收活動的活動時間表。
類 Classes
顯示一個與已裝載類的圖表的活動時間表。
線程 Threads
顯示一個與動態線程圖表的活動時間表。
CPU負載 CPU Load
顯示一段時間中CPU的負載圖表。

參考

使用JProfiler進行內存分析

本文由博客一文多發平臺 OpenWrite 發佈!
相關文章
相關標籤/搜索