簡體   English   中英

如何分析 .hprof 文件?

[英]How do I analyze a .hprof file?

我有一個使用以下標志運行的生產服務器: - XX:+HeapDumpOnOutOfMemoryError

昨晚,當我們的服務器遇到堆錯誤時,它生成了一個 java-38942.hprof 文件。 事實證明,系統的開發人員知道該標志,但無法從中獲取任何有用的信息。

有任何想法嗎?

如果您想要一個相當高級的工具來進行一些認真的探索,請查看 Eclipse 中的 Memory Analyzer 項目該項目由 SAP 提供。

您可以做的一些事情對於查找內存泄漏等非常有用 - 包括針對內存對象運行一種形式的受限 SQL (OQL),即

SELECT toString(firstName) FROM com.yourcompany.somepackage.User

非常棒。

您可以使用JHAT ,即 JDK 默認提供的 Java 堆分析工具。 它是命令行,但會啟動用於檢查內存的 Web 服務器/瀏覽器。 不是最用戶友好的,但至少它已經安裝在你要去的大多數地方。 一個非常有用的視圖是最底部的“堆直方圖”鏈接。

例如: jhat -port 7401 -J-Xmx4G dump.hprof

jhat也可以“這些天”執行 OQL(底部鏈接“執行 OQL”)

您還可以使用來自 Netbeans Profiler 或Visual VM獨立工具的HeapWalker Visual VM 是 JHAT 的一個很好的替代品,因為它是獨立的,但比 JHAT 更容易使用。

您需要 Java 6+ 才能完全使用 Visual VM。

只需獲取Eclipse 內存分析器 沒有比這更好的了,而且是免費的。

JHAT 僅可用於“玩具應用程序”

YourKit Java Profiler 似乎也可以處理它們。

如果你想對你的 heapdump 進行自定義分析,那么有:

這個庫速度很快,但你需要用 Java 編寫分析代碼。

從文檔:

  • 不在磁盤上創建任何臨時文件來處理堆轉儲
  • 可以直接工作 GZ 壓縮堆轉儲
  • 堆路徑表示法

我個人更喜歡 VisualVM。 我喜歡 VisualVM 的功能之一是堆轉儲比較。 在進行堆轉儲分析時,有多種方法可以找出導致崩潰的原因。 我發現有用的方法之一是比較健康和不健康的堆轉儲。

以下是您可以遵循的步驟:

  1. 獲取 OutOfMemoryError 的堆轉儲,我們稱之為“oome.hprof”。 您可以通過 JVM 參數 HeapDumpOnOutOfMemoryError 獲取此信息。
  2. 重新啟動應用程序,讓它根據您的應用程序運行很長時間(分鍾/小時)。 在應用程序仍在運行時獲取另一個堆轉儲。 我們稱之為“healthy.hprof”。
  3. 您可以在 VisualVM 中打開這兩個轉儲並進行堆轉儲比較。 您可以在類或包級別執行此操作。 這通常可以為您指明問題的方向。

鏈接: https : //visualvm.github.io

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM