捕获Java堆转储的7个选项
堆轉(zhuǎn)儲是診斷與內(nèi)存相關(guān)的問題的重要工件,例如內(nèi)存泄漏緩慢,垃圾回收問題和java.lang.OutOfMemoryError。它們也是優(yōu)化內(nèi)存消耗的重要工件。
有很多很棒的工具,例如Eclipse MAT和Heap Hero,可以分析堆轉(zhuǎn)儲。 但是,您需要為這些工具提供以正確的格式和正確的時(shí)間點(diǎn)捕獲的堆轉(zhuǎn)儲。
本文為您提供了捕獲堆轉(zhuǎn)儲的多個(gè)選項(xiàng)。 但是,我認(rèn)為前三個(gè)是有效的選擇,而其他三個(gè)則是個(gè)不錯(cuò)的選擇。
1. jmap
jmap打印堆轉(zhuǎn)儲到指定的文件位置。 該工具打包在JDK中。 可以在bin文件夾中找到它。
這是調(diào)用jmap的方法:
jmap -dump:format=b,file=<file-path> <pid> where pid: is the Java Process Id, whose heap dump should be captured file-path: is the file path where heap dump will be written in to.例:
| 1個(gè) | jmap -dump:format = b,file = / opt / tmp / heapdump.bin 37320 |
注意:傳遞“實(shí)時(shí)”選項(xiàng)非常重要。 如果傳遞了此選項(xiàng),則僅將內(nèi)存中的活動(dòng)對象寫入堆轉(zhuǎn)儲文件。 如果未通過此選項(xiàng),則所有對象,即使是準(zhǔn)備進(jìn)行垃圾回收的對象,都將打印在堆轉(zhuǎn)儲文件中。 它將大大增加堆轉(zhuǎn)儲文件的大小。 這也將使分析變得乏味。 要解決內(nèi)存問題或優(yōu)化內(nèi)存,僅“ live”選項(xiàng)就足夠了。
2. HeapDumpOnOutOfMemoryError
當(dāng)應(yīng)用程序遇到j(luò)ava.lang.OutOfMemoryError時(shí),理想的方法是立即捕獲堆轉(zhuǎn)儲以診斷問題,因?yàn)槟胫纉ava.lang.OutOfMemoryError發(fā)生時(shí)內(nèi)存中有哪些對象以及它們占據(jù)的內(nèi)存百分比。 但是,由于當(dāng)前的高溫,大多數(shù)情況下,IT /運(yùn)營團(tuán)隊(duì)會忘記捕獲堆轉(zhuǎn)儲。 不僅如此,他們還重新啟動(dòng)了應(yīng)用程序。 如果沒有在正確的時(shí)間捕獲堆轉(zhuǎn)儲,就很難診斷出任何內(nèi)存問題。
這就是該選項(xiàng)非常方便的地方。 在應(yīng)用程序啟動(dòng)期間傳遞“ -XX:+ HeapDumpOnOutOfMemoryError”系統(tǒng)屬性時(shí),JVM將在JVM遇到OutOfMemoryError時(shí)立即捕獲堆轉(zhuǎn)儲。
用法示例:
1個(gè)注意:捕獲的堆轉(zhuǎn)儲將在'-XX:HeapDumpPath'系統(tǒng)屬性指定的位置打印。
最佳實(shí)踐 :始終保持在所有應(yīng)用程序中配置此屬性,因?yàn)槟肋h(yuǎn)不知道何時(shí)會發(fā)生OutOfMemoryError.jcmd3。
3. jcmd
jcmd工具用于將診斷命令請求發(fā)送到JVM。 它打包為JDK的一部分。 可以在bin文件夾中找到它。
這是調(diào)用jcmd的方法:
1個(gè)例:
| 1個(gè)jcmd 37320 GC.heap_dump /opt/tmp/heapdump.bin |
4. JVisualVM
JVisualVM是一個(gè)監(jiān)視,故障排除工具,打包在JDK中。 啟動(dòng)此工具時(shí),您可以看到本地計(jì)算機(jī)上正在運(yùn)行的所有Java進(jìn)程。 您也可以使用此工具連接到在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的Java進(jìn)程。
腳步:
5. JMX
有一個(gè)com.sun.management:type=HotSpotDiagnostic MBean 。 此MBean具有“ dumpHeap”操作。 調(diào)用此操作將捕獲堆轉(zhuǎn)儲。 'dumpHeap'操作采用兩個(gè)輸入?yún)?shù):
您可以使用JConsole, jmxsh ,Java Mission Control等JMX客戶端來調(diào)用此MBean操作。
圖:使用Java Mission Control作為JMX客戶端來生成堆轉(zhuǎn)儲6.程序化方法
除了使用工具之外,您還可以以編程方式從應(yīng)用程序中捕獲堆轉(zhuǎn)儲。 在某些情況下,您可能希望基于應(yīng)用程序中的某些事件來捕獲堆轉(zhuǎn)儲。 這是Oracle的一篇好文章 ,通過調(diào)用com.sun.management:type=HotSpotDiagnostic MBean JMX Bean,提供了從應(yīng)用程序捕獲堆轉(zhuǎn)儲的源代碼,我們在上述方法中對此進(jìn)行了討論。
7. IBM管理控制臺
如果您的應(yīng)用程序在IBM Websphere Application Server上運(yùn)行,則可以使用管理控制臺來生成堆。
腳步:
您也可以使用wsadmin生成堆轉(zhuǎn)儲。
翻譯自: https://www.javacodegeeks.com/2019/10/7-options-to-capture-java-heap-dumps.html
總結(jié)
以上是生活随笔為你收集整理的捕获Java堆转储的7个选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 从未导入_Java 8的10个
- 下一篇: 海盗船推出新款 DDR5-6800 内存