Java堆轉儲:您可以完成任務嗎?

如果您像我一樣對Java性能充滿熱情,那么堆轉儲分析對您來說應該不是一個謎。 如果是這樣,那么好消息是您將有機會提高您的Java故障診斷技能和JVM知識。

JVM現已發展到今天,與舊的JDK 1.0 – JDK 1.4天相比,今天生成和分析JVM堆轉儲要容易得多。

堆轉儲分析不應視為替代配置文件和JVM分析工具(例如JProfiler或Plumbr),而是可以互補的。 在對Java堆內存泄漏和java.lang.OutOfMemoryError問題進行故障排除時,此功能特別有用。

這篇文章將為您提供JVM堆轉儲的概述以及對它的期望。 它還將提供有關如何以及何時應該花時間分析堆轉儲的建議。 未來的文章將包括有關分析過程本身的教程。

Java堆轉儲概述

JVM堆轉儲基本上是給定時間的Java堆內存的“快照”。 它與作為線程快照的JVM線程轉儲完全不同。

此類快照包含有關Java對象和在Java堆上分配的類的低級詳細信息,例如:

  • Java對象,例如Class,字段,原始值和引用
  • 與類加載器相關的數據,包括靜態字段(對于類加載器泄漏問題很重要)
  • 可從堆外部訪問的垃圾收集根或對象(系統類加載器已加載資源,例如rt.jar,JNI或本機變量,線程,Java Locals等)
  • 與線程相關的數據和堆棧(對于突然出現的Java堆增加問題特別有用,尤其是與線程轉儲分析結合使用時)

請注意,通常建議在完整GC之后生成堆轉儲,以消除未引用對象中不必要的“噪音”。

分析保留給精英?

在過去的十年中,與生產支持團隊一起工作時,我發現一個普遍的誤解是給人留下深刻印象,即更深入的分析任務(例如性能分析,堆轉儲或線程轉儲分析)留給了“精英”或產品供應商(Oracle,IBM等)。 。

我完全不同意。

作為Java開發人員,您編寫的代碼可能在高度并發的線程環境中運行,從而在JVM上管理數百個對象。 您不僅要擔心并發問題,還要擔心垃圾回收和應用程序的內存占用。 由于您是應用程序的專家,因此您處于執行此分析的最佳位置。

在下面找到您應該能夠回答的典型問題:

  • 根據負載預測,需要多少個并發線程來并發運行我的應用程序? 每個活動線程在完成任務之前要消耗多少內存?
  • 我的應用程序的靜態內存占用量是多少? (庫,類加載器占用空間,內存中緩存數據結構等)
  • 負載下我的應用程序的動態內存占用量是多少? (會話足跡等)
  • 您是否對應用程序進行了概要分析,以防內存泄漏?

負載測試,對應用程序進行性能分析以及分析Java堆轉儲(例如:在負載測試或生產問題期間捕獲)將使您能夠回答上述問題。 然后,您將可以實現以下目標:

  • 降低生產實施后出現性能問題的風險
  • 通過為生產和產能管理團隊提供額外的指導和事實,為您的工作和客戶增加價值; 允許他們采取適當的IT改進措施
  • 分析影響客戶IT生產環境的內存泄漏或占用空間問題的根本原因
  • 通過學習這些性能分析原理和技術來提高您的技術技能
  • 通過提高您對JVM,垃圾回收和Java對象生命周期的了解來提高JVM技能

您想要了解的最后一件事是技能“高原”。 如果您不喜歡這種類型的分析,那么我的建議如下:

  • 要求團隊中更高級的成員執行堆轉儲分析并確定他的工作和方法
  • 一旦您感到更自在,就請自己自愿執行相同的分析(針對不同的問題案例),這一次請一位經驗豐富的成員來完成您的分析工作
  • 最終,學生(您)將成為導師


何時使用

每次遇到Java堆問題(例如OutOfMemoryError)時,都不應分析JVM堆轉儲。 由于這可能是一個耗時的分析過程,因此我建議針對以下情況進行此分析:

  • 需要了解和調整您的應用程序和/或周圍的API或Java EE容器本身的內存占用量
  • Java堆內存泄漏故障排除
  • Java類加載器內存泄漏
  • 突然的Java堆增加問題或觸發事件(必須與線程轉儲分析結合起來作為起點)

現在,在下面找到與堆轉儲分析相關的一些限制:

  • JVM堆轉儲生成是一項繁重的計算任務,它將使您的JVM掛起直到完成。 需要進行適當的盡職調查,以減少對生產環境的影響
  • 分析堆轉儲不會提供完整的Java進程內存占用量,例如本機堆。 為此,您將需要依賴其他工具和OS命令
  • 您可能會遇到打開和解析從舊版本的JDK(例如1.4或1.5)生成的堆轉儲時遇到的問題


堆轉儲生成技術

JVM堆轉儲通常是通過以下2個操作生成的:

  • 由于java.lang.OutOfMemoryError(例如Java Heap,PermGen或本機堆耗盡)而自動生成或觸發
  • 通過使用諸如jmap,VisualVM(通過JMX)或OS級命令之類的工具手動生成


#自動觸發的堆轉儲

如果您使用的是HotSpot Java VM 1.5+或JRockit R28 +,則需要在JVM啟動時在下面添加以下參數:

-XX:+HeapDumpOnOutOfMemoryError

上面的參數將使HotSpot VM在OOM事件之后自動生成堆轉儲。 這些JVM類型的堆轉儲格式為HPROF(* .hprof)。

如果您使用的是IBM JVM 1.4.2+,那么默認情況下會啟用OOM事件導致的堆轉儲。 IBM JVM的堆轉儲格式為PHD(* .phd)。

#手動觸發的堆轉儲

可以按以下方式手動生成JVM堆轉儲:

  • jmap在HotSpot 1.5+中的使用
  • VisualVM for HotSpot 1.6+的使用*推薦*

**請對您的生產環境進行適當的盡職調查,因為JVM堆轉儲生成是一個侵入性過程,它將使您的JVM進程掛起直到完成**

如果使用的是IBM JVM 1.4.2,則需要從JVM啟動中添加以下環境變量:

export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true

對于IBM JVM 1.5+,您將需要在Java啟動時添加以下參數:

-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'.

請查看IBM JVM1.5 +的Xdump文檔。

對于Linux和AIX?,通過kill –QUIT或kill -3發送IBM JVM堆轉儲信號。 此OS命令將觸發JVM堆轉儲生成(PHD格式)。

我建議您查看MAT摘要頁面,以了解如何通過各種JVM和OS組合獲取JVM堆轉儲。

堆轉儲分析工具

我推薦的用于打開和分析JVM堆轉儲的主要工具是Eclipse Memory Analyzer (MAT)。 到目前為止,這是SAP和IBM等貢獻者中最好的工具。 該工具提供了豐富的界面和先進的堆轉儲分析功能,其中包括“泄漏可疑”報告。 MAT還支持HPROF和PHD堆轉儲格式。

我建議在較早的文章中獲得有關如何使用MAT和分析您的第一個JVM堆轉儲的快速教程 。 我也有一些堆轉儲分析案例研究對您的學習過程很有用。


最后的話

我真的希望您能像我一樣喜歡JVM堆轉儲分析。 以后的文章將為您提供有關如何分析JVM堆轉儲以及從何處開始的通用教程。 請隨時提供您的意見。

參考: Java堆轉儲:您可以完成任務嗎? 從我們的JCG合作伙伴 Pierre-Hugues Charbonneau在Java EE支持模式和Java教程博客中獲得。

翻譯自: https://www.javacodegeeks.com/2012/11/java-heap-dump-are-you-up-to-the-task.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MariaDB配置、集群

MariaDB在centos 7.3的安裝,配置和集群搭配 阿里云最新選配系統中,只有centos7.3可選,因此,基于centos 7的MariaDB的安裝,配置。。。 全部刪除MySQL/MariaDB MySQL 已經不再包含在 CentOS 7 的源中,而改用了…

java 調用 ictclas50_1-Ictclas50分詞系統ForJava

Ictclas50是一個分詞庫,我嘛主要用來做中文分詞,其也能分出詞性等東西。1.環境搭建進入到下載頁面進行下載:如下圖: 因為我的系統是64位的windows,所以選擇了到數第三行進行下載。其JAVA版本是通過JNI去調用dll庫&…

SpringMVC亂碼或前臺亂碼解決辦法

JSP頁面亂碼 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> 以及 form表單提交方式為必須為post 修改web.xml&#xff0c;增加編碼過濾器&#xff0c;如下&#xff08;注意&#xff0c;需要設置forceEncoding參數值…

Beam概念學習系列之Pipeline Runners

不多說&#xff0c;直接上干貨&#xff01; https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上運行引擎會根據你選擇的分布式處理引擎&#xff0c;其中兼容的 API 轉換你的 Beam 程序應用&#xff0c;讓你的 Beam 應用程序可以有效的運行在指定的分布式處理引…

使普通的舊Java OSGi兼容

盡管OSGi在Java世界中越來越流行&#xff0c;但仍有許多Java應用程序和庫尚未設計成可在OSGi中使用。 有時您可能需要在OSGi環境中運行這樣的代碼&#xff0c;或者是因為您想利用OSGi本身提供的好處&#xff0c;或者因為您需要僅由該特定環境提供的某些功能。 通常&#xff0c;…

運行 java classnotfound_JAR運行出現ClassNotFoundException異常的解決辦法

2009年10月30日最近在弄個聊天室,由于要跟數據庫通信,用到了JDBC的3個jar,在eclipse里OK的,但布置到服務器壞事了,不知道怎么弄JDBC的3個jar了寫個autoStart.batjava -jar chatServer.jarpause運行報錯:F:\mydocuments\java project\socketTest\release>java -jar chatServe…

idea 創建多模塊依賴Maven項目

轉載地址&#xff1a; http://www.cnblogs.com/tibit/p/6185704.html idea 創建多模塊依賴Maven項目 本來網上的教程還算多&#xff0c;但是本著自己有的才是自己的原則&#xff0c;還是自己寫一份的好&#xff0c;雖然可能自己也不會真的用得著。 1. 創建一個新maven項目 2.…

移動端適配問題

適配問題 怎么適配iphone6 1px問題 為什么頁面與設計稿會出現偏差&#xff1f; dpr設備像素/ css像素&#xff0c;只有dpr等于1的時候&#xff0c;實際效果和設計稿的尺寸比例才是1:1。因為iPhone6的DPR&#xff08;設備像素比&#xff09;為2&#xff0c;設備像素為750&…

用Java彈出創建新的消息通知

首先創建JFrame作為彈出窗口。 在其中添加一些JLabel以包含信息&#xff0c;并在適當的位置分配它們&#xff0c;使其看起來像一條通知消息。 下面給出了示例代碼&#xff1a; String message You got a new notification message. Isnt it awesome to have such a notificat…

mysql游標表間數據遷移_FalseMySQL存儲過程--gt;通過游標遍歷和異常處理遷移數據到歷史表-mysql-第二電腦網...

-- 大表數據遷移,每天凌晨1點到5點執行,執行間隔時間10分鐘&#xff0c;遷移舊數據到歷史表。DELIMITER $$USE dbx$$電腦技術網對《FalseMySQL存儲過程-->通過游標遍歷和異常處理遷移數據到歷史表》總結來說&#xff0c;為我們程序員很實用。DROP PROCEDURE IF EXISTS pro_x…

課后作業-閱讀任務-閱讀筆記-2

好的單元測試的標準&#xff1a; 1>單元測試應該在最基本的功能/參數上驗證程序的正確性 2>單元測試必須由最熟悉代碼的人&#xff08;程序的作者&#xff09;來寫 3>單元測試后&#xff0c;機器狀態保持不變 4>單元測試要快&#xff08;一個測試的運行時間是幾秒鐘…

定位-固定定位

把box2設為固定定位&#xff1a; <!DOCTYPE html> <html lang"en" dir"ltr"><head><meta charset"utf-8"><title>定位</title><style media"screen">.box1{width:100px; height: 100px;ba…

垃圾自動回收

自動回收 自動回收的語言&#xff1a;根據變量是否還被引用&#xff0c;來確定是否應該回收Javascript內存泄露 由于js回調及閉包的特性&#xff0c;當方法嵌套太多的時候&#xff0c;可能回最外層的變量可能一直都被引用著&#xff0c;這樣就導致變量一直沒有被回收&#xff0…

Java并發執行器的懶惰開發人員簡介

如果我告訴您util.concurrent API自2004年起提供此類服務&#xff0c;我就會自欺欺人。但是&#xff0c;我想回顧一下一些很酷的功能。 并發專家&#xff0c;現在是時候關閉該窗口了。 所有其他人&#xff0c;請緊緊抓住樂趣。 你不會忘記你的根源 執行程序是具有單個執行方法…

《我們應該怎樣做需求分析》閱讀筆記

認識&#xff1a;軟件需求分析是貫穿軟件項目從出生到成長或者死亡的&#xff0c;我們必須搞清楚到手的軟件是為了什么要做什么做成什么樣&#xff0c;通過顧客的描述彼此的合作分析需求與業務邏輯&#xff0c;不斷改進從而實現軟件在合理范圍內符合顧客要求。 怎么做&#xff…

Java代碼格式化算法_一個時間格式化的工具類:TimeUtil

源代碼如下&#xff1a;import android.content.Context;import android.text.TextUtils;import android.text.format.DateUtils;import java.text.Format;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.regex.Matcher…

(轉)VS2010/MFC編程入門之前言

雞啄米的C編程入門系列給大家講了C的編程入門知識&#xff0c;大家對C語言在語法和設計思想上應該有了一定的了解了。但是教程中講的例子只是一個個簡單的例程&#xff0c;并沒有可視化窗口。雞啄米在這套VS2010/MFC編程入門教程中將會給大家講解怎樣使用VS2010進行可視化編程&…

JavaOne 2012:JavaFX圖形技巧和竅門

我回到希爾頓&#xff08;皇家宴會廳B&#xff09;看了Richard Bair的&#xff08;Oracle Java客戶架構師&#xff09;的“ JavaFX圖形技巧和竅門”。 Bair與FX Experience相關聯&#xff0c;并且顯然了解JavaFX。 拜爾說&#xff0c;他演講的主題是表演。 他告誡說&#xff0c…

web前端知識點1

1. input屬于窗體元素,層級顯示比flash、其它元素都高。請判斷這句話的正確與否。 錯誤 層級顯示優先級&#xff1a; frameset > 表單元素 > 非表單元素 在html中&#xff0c;幀元素&#xff08;frameset&#xff09;的優先級最高&#xff0c;表單元素比非表單元素的優…

18. 使用模板【從零開始學Spring Boot】

轉&#xff1a;http://blog.csdn.net/linxingliang/article/details/52017098 18.1 使用thymeleaf 整體步驟&#xff1a; &#xff08;1&#xff09; 在pom.xml中引入thymeleaf; &#xff08;2&#xff09; 如何關閉thymeleaf緩存 &#xff08;3&#xff09; …