java 堆转储快照_Java堆转储:您可以完成任务吗?
java 堆轉(zhuǎn)儲(chǔ)快照
如果您像我一樣對(duì)Java性能充滿熱情,那么堆轉(zhuǎn)儲(chǔ)分析對(duì)您來說應(yīng)該不是一個(gè)謎。 如果是這樣,那么好消息是您將有機(jī)會(huì)增加您的Java故障排除技能和JVM知識(shí)。
JVM現(xiàn)在已經(jīng)發(fā)展到這樣的程度:與舊的JDK 1.0 – JDK 1.4天相比,今天生成和分析JVM堆轉(zhuǎn)儲(chǔ)要容易得多。
堆轉(zhuǎn)儲(chǔ)分析不應(yīng)視為替代配置文件和JVM分析工具(例如JProfiler或Plumbr),而是可以互補(bǔ)的。 在對(duì)Java堆內(nèi)存泄漏和java.lang.OutOfMemoryError問題進(jìn)行故障排除時(shí),此功能特別有用。
這篇文章將為您提供有關(guān)JVM堆轉(zhuǎn)儲(chǔ)的概述以及對(duì)它的期望。 它還將提供有關(guān)如何以及何時(shí)應(yīng)該花時(shí)間分析堆轉(zhuǎn)儲(chǔ)的建議。 未來的文章將包括有關(guān)分析過程本身的教程。
Java堆轉(zhuǎn)儲(chǔ)概述
JVM堆轉(zhuǎn)儲(chǔ)基本上是給定時(shí)間的Java堆內(nèi)存的“快照”。 它與作為線程快照的JVM線程轉(zhuǎn)儲(chǔ)完全不同。
此類快照包含有關(guān)Java對(duì)象和在Java堆上分配的類的低級(jí)詳細(xì)信息,例如:
- Java對(duì)象,例如Class,字段,原始值和引用
- 與類加載器相關(guān)的數(shù)據(jù),包括靜態(tài)字段(對(duì)于類加載器泄漏問題很重要)
- 可從堆外部訪問的垃圾收集根或?qū)ο?#xff08;系統(tǒng)類加載器已加載資源,例如rt.jar,JNI或本機(jī)變量,線程,Java Locals等)
- 線程相關(guān)的數(shù)據(jù)和堆棧(對(duì)于突然出現(xiàn)的Java堆增加問題特別有用,尤其是與線程轉(zhuǎn)儲(chǔ)分析結(jié)合使用時(shí))
請(qǐng)注意,通常建議在完整的GC之后生成堆轉(zhuǎn)儲(chǔ),以消除未引用對(duì)象中不必要的“噪音”。
分析保留給精英?
在過去的十年中,與生產(chǎn)支持團(tuán)隊(duì)一起工作時(shí),我發(fā)現(xiàn)一個(gè)普遍的誤解是給人留下深刻印象,即更深入的分析任務(wù)(例如性能分析,堆轉(zhuǎn)儲(chǔ)或線程轉(zhuǎn)儲(chǔ)分析)留給了“精英”或產(chǎn)品供應(yīng)商(Oracle,IBM等)。 。
我不能不同意。
作為Java開發(fā)人員,您編寫的代碼可能在高度并發(fā)的線程環(huán)境中運(yùn)行,從而在JVM上管理數(shù)百個(gè)對(duì)象。 您不僅要擔(dān)心并發(fā)問題,還要擔(dān)心垃圾回收和應(yīng)用程序的內(nèi)存占用。 由于您是應(yīng)用程序的專家,因此您處于執(zhí)行此分析的最佳位置。
在下面找到您應(yīng)該能夠回答的典型問題:
- 根據(jù)負(fù)載預(yù)測,需要多少個(gè)并發(fā)線程來并發(fā)運(yùn)行我的應(yīng)用程序? 每個(gè)活動(dòng)線程在完成任務(wù)之前要消耗多少內(nèi)存?
- 我的應(yīng)用程序的靜態(tài)內(nèi)存占用量是多少? (庫,類加載器占用空間,內(nèi)存中緩存數(shù)據(jù)結(jié)構(gòu)等)
- 負(fù)載下我的應(yīng)用程序的動(dòng)態(tài)內(nèi)存占用量是多少? (會(huì)話足跡等)
- 您是否對(duì)應(yīng)用程序進(jìn)行了概要分析,以防內(nèi)存泄漏?
負(fù)載測試,對(duì)應(yīng)用程序進(jìn)行性能分析以及分析Java堆轉(zhuǎn)儲(chǔ)(例如:在負(fù)載測試或生產(chǎn)問題期間捕獲)將使您能夠回答上述問題。 然后,您將可以實(shí)現(xiàn)以下目標(biāo):
- 降低生產(chǎn)實(shí)施后出現(xiàn)性能問題的風(fēng)險(xiǎn)
- 通過為生產(chǎn)和產(chǎn)能管理團(tuán)隊(duì)提供額外的指導(dǎo)和事實(shí),為您的工作和客戶增加價(jià)值; 使他們能夠采取適當(dāng)?shù)腎T改進(jìn)措施
- 分析影響客戶IT生產(chǎn)環(huán)境的內(nèi)存泄漏或占用空間問題的根本原因
- 通過學(xué)習(xí)這些性能分析原理和技術(shù)來提高您的技術(shù)技能
- 通過提高您對(duì)JVM,垃圾回收和Java對(duì)象生命周期的了解來提高JVM技能
您想要了解的最后一件事是技能“高原”。 如果您不喜歡這種類型的分析,那么我的建議如下:
- 要求團(tuán)隊(duì)中的其他高級(jí)成員執(zhí)行堆轉(zhuǎn)儲(chǔ)分析,并對(duì)他的工作和方法進(jìn)行評(píng)估
- 一旦您感到更自在,就請(qǐng)自己自愿執(zhí)行相同的分析(針對(duì)不同的問題案例),這一次請(qǐng)一位經(jīng)驗(yàn)豐富的成員來完成您的分析工作
- 最終,學(xué)生(您)將成為導(dǎo)師
何時(shí)使用
每次遇到Java堆問題(例如OutOfMemoryError)時(shí),都不應(yīng)完成對(duì)JVM堆轉(zhuǎn)儲(chǔ)的分析。 由于這可能是一個(gè)耗時(shí)的分析過程,因此我建議針對(duì)以下方案進(jìn)行此分析:
- 需要了解和調(diào)整您的應(yīng)用程序和/或周圍的API或Java EE容器本身的內(nèi)存占用量
- Java堆內(nèi)存泄漏故障排除
- Java類加載器內(nèi)存泄漏
- 突然的Java堆增加問題或觸發(fā)事件(必須與線程轉(zhuǎn)儲(chǔ)分析結(jié)合作為起點(diǎn))
現(xiàn)在,在下面找到與堆轉(zhuǎn)儲(chǔ)分析相關(guān)的一些限制:
- JVM堆轉(zhuǎn)儲(chǔ)生成是一項(xiàng)繁重的計(jì)算任務(wù),它將使您的JVM掛起直到完成。 需要進(jìn)行適當(dāng)?shù)谋M職調(diào)查,以減少對(duì)生產(chǎn)環(huán)境的影響
- 分析堆轉(zhuǎn)儲(chǔ)不會(huì)提供完整的Java進(jìn)程內(nèi)存占用量,例如本機(jī)堆。 為此,您將需要依賴其他工具和操作系統(tǒng)命令
- 您可能會(huì)遇到打開和解析從舊版本的JDK(例如1.4或1.5)生成的堆轉(zhuǎn)儲(chǔ)時(shí)遇到的問題
堆轉(zhuǎn)儲(chǔ)生成技術(shù)
JVM堆轉(zhuǎn)儲(chǔ)通常是通過以下2個(gè)操作生成的:
- 由于java.lang.OutOfMemoryError(例如Java Heap,PermGen或本機(jī)堆耗盡)而自動(dòng)生成或觸發(fā)
- 通過使用諸如jmap,VisualVM(通過JMX)或OS級(jí)命令之類的工具手動(dòng)生成
#自動(dòng)觸發(fā)的堆轉(zhuǎn)儲(chǔ)
如果您使用的是HotSpot Java VM 1.5+或JRockit R28 +,則需要在JVM啟動(dòng)時(shí)在下面添加以下參數(shù):
-XX:+HeapDumpOnOutOfMemoryError上面的參數(shù)將使HotSpot VM在OOM事件之后自動(dòng)生成堆轉(zhuǎn)儲(chǔ)。 這些JVM類型的堆轉(zhuǎn)儲(chǔ)格式為HPROF(* .hprof)。
如果使用的是IBM JVM 1.4.2+,那么默認(rèn)情況下會(huì)啟用OOM事件導(dǎo)致的堆轉(zhuǎn)儲(chǔ)生成。 IBM JVM的堆轉(zhuǎn)儲(chǔ)格式為PHD(* .phd)。
#手動(dòng)觸發(fā)的堆轉(zhuǎn)儲(chǔ)
可以按以下方式手動(dòng)生成JVM堆轉(zhuǎn)儲(chǔ):
- jmap在HotSpot 1.5+中的使用
- VisualVM for HotSpot 1.6+的使用*推薦*
**請(qǐng)對(duì)您的生產(chǎn)環(huán)境進(jìn)行適當(dāng)?shù)谋M職調(diào)查,因?yàn)镴VM堆轉(zhuǎn)儲(chǔ)生成是一個(gè)侵入性過程,它將使您的JVM進(jìn)程掛起直到完成**
如果使用的是IBM JVM 1.4.2,則需要從JVM啟動(dòng)中添加以下環(huán)境變量:
export IBM_HEAPDUMP=true export IBM_HEAP_DUMP=true對(duì)于IBM JVM 1.5+,您將需要在Java啟動(dòng)時(shí)添加以下參數(shù):
-Xdump:heap例如:
java -Xdump:none -Xdump:heap:events=vmstop,opts=PHD+CLASSIC JVMDUMP006I Processing Dump Event 'vmstop', detail '#00000000' - Please Wait. JVMDUMP007I JVM Requesting Heap Dump using 'C:\sdk\jre\bin\heapdump.20050323.142011.3272.phd' JVMDUMP010I Heap Dump written to C:\sdk\jre\bin\heapdump.20050323.142011.3272.phd JVMDUMP007I JVM Requesting Heap Dump using 'C:\sdk\jre\bin\heapdump.20050323.142011.3272.txt' JVMDUMP010I Heap Dump written to C:\sdk\jre\bin\heapdump.20050323.142011.3272.txt JVMDUMP013I Processed Dump Event 'vmstop', detail '#00000000'.請(qǐng)查看IBM JVM1.5 +的Xdump文檔。
對(duì)于Linux和AIX?,通過kill –QUIT或kill -3發(fā)送IBM JVM堆轉(zhuǎn)儲(chǔ)信號(hào)。 此OS命令將觸發(fā)JVM堆轉(zhuǎn)儲(chǔ)生成(PHD格式)。
我建議您查看MAT摘要頁面,以了解如何通過各種JVM和OS組合獲取JVM堆轉(zhuǎn)儲(chǔ)。
堆轉(zhuǎn)儲(chǔ)分析工具
我推薦的用于打開和分析JVM堆轉(zhuǎn)儲(chǔ)的主要工具是Eclipse Memory Analyzer (MAT)。 到目前為止,這是SAP和IBM等貢獻(xiàn)者中最好的工具。 該工具提供了豐富的界面和高級(jí)的堆轉(zhuǎn)儲(chǔ)分析功能,其中包括“泄漏可疑”報(bào)告。 MAT還支持HPROF和PHD堆轉(zhuǎn)儲(chǔ)格式。
我建議在較早的文章中獲得有關(guān)如何使用MAT和分析您的第一個(gè)JVM堆轉(zhuǎn)儲(chǔ)的快速教程 。 我也有一些堆轉(zhuǎn)儲(chǔ)分析案例研究對(duì)您的學(xué)習(xí)過程很有用。
最后的話
我真的希望您能像我一樣喜歡JVM堆轉(zhuǎn)儲(chǔ)分析。 未來的文章將為您提供有關(guān)如何分析JVM堆轉(zhuǎn)儲(chǔ)以及從何處開始的通用教程。 請(qǐng)隨時(shí)提供您的意見。
參考: Java堆轉(zhuǎn)儲(chǔ):您可以完成任務(wù)嗎? 從我們的JCG合作伙伴 Pierre-Hugues Charbonneau在Java EE支持模式和Java教程博客中獲得。
翻譯自: https://www.javacodegeeks.com/2012/11/java-heap-dump-are-you-up-to-the-task.html
java 堆轉(zhuǎn)儲(chǔ)快照
總結(jié)
以上是生活随笔為你收集整理的java 堆转储快照_Java堆转储:您可以完成任务吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux虚拟机与虚拟机间传文件(lin
- 下一篇: java美元兑换,(Java实现) 美元