java 堆转储快照_Java堆转储:您可以完成任务吗?

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进程内存占用量,例如本机堆。 为此,您将需要依赖其他工具和操作系统命令
  • 您可能会遇到打开和解析从旧版本的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

java 堆转储快照

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电池供电的电容麦_太阳能航空障碍灯供电机制设计

南京徐航航空设备有限公司是以产销GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯,GPS航空障碍灯,led航空障碍灯,LED智能航空障碍灯,交流航空障碍灯,航空障碍灯品牌,智能型航空障碍灯等方面产品获得民航认证航空障碍灯品牌,是…

simulink如何从goto模块快速找到相应的from模块

有时候,Simulink搭建的模型中模块过多,很难找到goto模块所对应的from模块。下面将举例说明如何从goto模块快速找到相应的from模块。 方法1 双击goto模块会弹出下图图框,点击图框的链接即可找到对应的from模块。如下图所示。 对应的from模块…

aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球

我朋友汪伦。最近在计划出国旅游,我问他都准备了啥,他说根据网上的攻略,带了现金泡面老干妈还有一万个充电宝。现金我懂,国外还没普及扫码支付;泡面是怕外国菜吃不惯;老干妈是夹汉堡吃的;一万个…

11 字节码执行

转载于:https://www.cnblogs.com/likevin/p/10183151.html

在Junit上使用Kafka

除了在原始Kafka Producer和Consumer上更易于使用的抽象之外,优秀的Spring Kafka项目提供的简洁功能之一是在测试中使用Kafka的方法。 它通过提供可轻松设置和拆卸的Kafka嵌入式版本来实现此目的。 一个项目需要包括此支持的全部就是“ spring-kafka-test”模块&am…

补码原理一个字节存储数值的范围如何计算

为什么二进制负数在计算机中的存储需要使用补码?一个字节存储数值范围为什么是-128~127?下面我们开始学习。 1.了解补码 什么是原码、反码和补码?负数在计算机中的二进制表示是怎样的?(戳这里查看) 2.补…

laravel API开发,使用dingo/api

1、composer添加 "dingo/api": "1.0.*dev" composer require dingo/api:1.0.xdev2、配置文件app.php添加注册 Dingo\Api\Provider\LaravelServiceProvider::class,3、添加自定义配置(此时会在配置文件中生成api.php) php artisan ve…

【SVN】代码提交备注规范

一、格式 <type>: <subject> 例如 fix&#xff1a;解决用户点击登录无响应的问题 二、详细说明 1、type &#xff1a;用于说明提交类型 feat - 增加新功能、新需求 fix - 修复bug, 可以是测试发现的bug, 也可以是研发自己发现的bug style - 不影响…

StarUML使用说明-指导手册

StarUML使用说明-指导手册 原著&#xff1a;Stephen Wong 翻译&#xff1a;火猴 1.综述 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具。这是一个用Java语言描述的创建类图的简明手册。 StarUML(简称SU)&#xff0c;是一种创建UML类图&#x…

elif else if oracle_关于Oracle if elsif else

昨天被一同事问一问题&#xff0c;问题就是Oracle存储过程中的IF逻辑块告诉他大概是这样&#xff1a;create or replace procedure testIfElsif (numb number) ISbeginif numb 1 thenDBMS_OUTPUT.put_line(1);else if numb 2 thenDBMS_OUTPUT.put_line(2);elseDBMS_OUTPUT.pu…

自相关函数互相关函数

这个是信号分析里边的概念。为比较某信号与另一延时的信号之间的相似度&#xff0c;需要引入相关函数的概念。相关函数是鉴别信号的有力工具&#xff0c;被广泛应用于雷达回波的识别&#xff0c;通信同步信号的识别等领域。相关函数 也称为相关积分&#xff0c;它与卷积的运算方…

php 加密解密函数封装

算法一&#xff1a;  //加密函数 function lock_url($txt,$keyyang) {$chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-";$nh rand(0,64);$ch $chars[$nh];$mdKey md5($key.$ch);$mdKey substr($mdKey,$nh%8, $nh%87);$txt base64_e…

visio画uml类图添加自定义数据类型

类图&#xff08;Class Diagram&#xff09;: 类图是面向对象系统建模中最常用和最重要的图&#xff0c;是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。 类图的3个基本组件&#xff1a;类名、属性、方法。 1、打开vis…

ansys怎么删除线段_科学网—ansys常用命令 - 刘敬寿的博文

prep7/pnum,label,key!在有限元模块图形中显示号码。Label&#xff1d;欲显示对象的名称&#xff0c;node节点&#xff0c;elem元素&#xff0c;kp点&#xff0c;line线&#xff0c;area面积&#xff0c;volu体积&#xff1b;key0为不显示号码(系统默认)&#xff0c;&#xff1…

nginx内存池大小快内存_使用直接内存时可以更快

nginx内存池大小快内存总览 使用直接内存不能保证提高性能。 考虑到它增加了复杂性&#xff0c;除非有充分的理由使用它&#xff0c;否则应避免使用它。 塞尔吉奥奥利维拉&#xff08;Sergio Oliveira Jr&#xff09;的这篇出色文章表明&#xff0c;这不仅仅是使用直接内存来…

Matlab归一化函数(mapminmax)

功能&#xff1a;将矩阵的每一行处理成[-1,1]区间。处理需要归一化的m*n矩阵X&#xff0c;归一化后的矩阵记为Y。 主要有5种调用形式 1.[Y,PS] mapminmax(X,YMIN,YMAX) 其中&#xff0c;YMIN是我们期望归一化后矩阵Y每行的最小值&#xff0c;YMAX是我们期望归一化后矩阵Y每…

ansible puppet saltstack三款自动化运维工具的对比

一、基础介绍 ansible基础介绍可参考&#xff1a;http://www.linuxidc.com/Linux/2017-12/149671.htm puppet基础介绍可参考&#xff1a;http://www.linuxidc.com/Linux/2017-12/149672.htm saltstack基础介绍可参考&#xff1a;http://www.linuxidc.com/Linux/2017-12/149675.…

Matlab repmat函数

repmat函数主要是以已知的数、向量或矩阵为基本元素&#xff0c;快速得产生一个大的矩阵&#xff0c;它的用法一般有下面几种&#xff1a; 1.使用相同元素初始化矩阵 A repmat(6,3,2) A 6 6 6 6 6 6 2.方块与矩形块格式 A diag([1 2 3]) b repm…

Linux虚拟地址空间布局

在多任务操作系统中&#xff0c;每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space)&#xff0c;在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3&#xff0c;而Windows系统为2:2(通过设…

我的方法在这方面看起来很大吗?

以下Java方法的大小是多少&#xff1f; public Collection getDescription() {SystemLibrary systemLib registry.get(SystemLibrary.class);Analysis analysis systemLib.getCurrentAnalysis(registry);return getDescription(analysis);}这个不起眼的方法查找某种系统库&a…