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.mzph.cn/news/371101.shtml

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

相关文章

java 调用 ictclas50_1-Ictclas50分词系统ForJava

Ictclas50是一个分词库,我嘛主要用来做中文分词,其也能分出词性等东西。1.环境搭建进入到下载页面进行下载:如下图: 因为我的系统是64位的windows,所以选择了到数第三行进行下载。其JAVA版本是通过JNI去调用dll库&…

Beam概念学习系列之Pipeline Runners

不多说,直接上干货! https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上运行引擎会根据你选择的分布式处理引擎,其中兼容的 API 转换你的 Beam 程序应用,让你的 Beam 应用程序可以有效的运行在指定的分布式处理引…

运行 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项目

转载地址: http://www.cnblogs.com/tibit/p/6185704.html idea 创建多模块依赖Maven项目 本来网上的教程还算多,但是本着自己有的才是自己的原则,还是自己写一份的好,虽然可能自己也不会真的用得着。 1. 创建一个新maven项目 2.…

用Java弹出创建新的消息通知

首先创建JFrame作为弹出窗口。 在其中添加一些JLabel以包含信息,并在适当的位置分配它们,使其看起来像一条通知消息。 下面给出了示例代码: String message You got a new notification message. Isnt it awesome to have such a notificat…

定位-固定定位

把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…

Java并发执行器的懒惰开发人员简介

如果我告诉您util.concurrent API自2004年起提供此类服务&#xff0c;我就会自欺欺人。但是&#xff0c;我想回顾一下一些很酷的功能。 并发专家&#xff0c;现在是时候关闭该窗口了。 所有其他人&#xff0c;请紧紧抓住乐趣。 你不会忘记你的根源 执行程序是具有单个执行方法…

《我们应该怎样做需求分析》阅读笔记

认识&#xff1a;软件需求分析是贯穿软件项目从出生到成长或者死亡的&#xff0c;我们必须搞清楚到手的软件是为了什么要做什么做成什么样&#xff0c;通过顾客的描述彼此的合作分析需求与业务逻辑&#xff0c;不断改进从而实现软件在合理范围内符合顾客要求。 怎么做&#xff…

(转)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;表单元素比非表单元素的优…

java单元测试算初级_Java____Eclipse下JUnit单元测试(初级)

给大家分享一个链接希望对你们有帮助 http://blog.csdn.net/huangbiao86/article/details/6709742今天看图片命名唯一的策略时看到有个大大用JUnit测试&#xff0c;神奇的样子&#xff0c;遂上网搜集来三篇JUnit测试的入门文章&#xff0c;作为参考。原作地址在上面&#xff0c…

有没有更好的Marker方法?

自Java 1.5推出以来&#xff0c;就是否在Java中使用Marker接口进行了广泛的讨论和辩论。 这是因为Java 1.5引入了注释功能&#xff0c;这些功能几乎可以解决Marker接口的目的。 本文将涵盖这场辩论的一个有趣的部分。 定义&#xff1a; Java中的标记接口是一个空接口&#xff…

php jquery ajax登录,jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)

弹出层主要用于展示丰富的页面信息&#xff0c;还有一个更好的应用是弹出表单层丰富交互应用。常见的应用有弹出登录表单层&#xff0c;用户提交登录信息&#xff0c;后台验证登录成功后&#xff0c;弹出层消失&#xff0c;主页面局部刷新用户信息。本文我们将给大家介绍如何使…

# 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践myod 因为在课上已经提交了四个实验&#xff0c;还欠缺最后一个实验&#xff0c;反省一下自己还是操作不熟练&#xff0c;平时在课下应该多多练习linux的命令训练。 实践一 每个* .c一个文件&#xff0c;每个*.h一…

CometD:Java Web应用程序的Facebook类似聊天

聊天就像吃一块蛋糕或喝一杯热咖啡一样容易。 您是否曾经考虑过自己开发聊天程序&#xff1f; 您知道&#xff0c;聊天不容易。 但是&#xff0c;如果您是开发人员&#xff0c;并且阅读了本文的结尾&#xff0c;则可以尝试自己开发一个聊天应用程序&#xff0c;并允许您的用户通…

怎么用PHP建立购物网站,如何使用PHP建设一个购物网站

本系统以PHP为主要制作工具&#xff0c;实现了用户注册、登录、验证身份及用户数据的采集、物品的预览查询、搜索/查看物品信息&#xff0c;站内最新物品信息发布&#xff0c;可进入在线下单从而实现了网络销售。网上购物&#xff0c;这个逐渐流行于二十世纪的购物方式已经为越…

团队作业2——需求分析原型设计

需求分析&#xff1a; 软件的最终目的是用来解决用户的某些问题&#xff0c;需求分析就是要理解要解决的问题&#xff0c;真正明确用户需求。请发表一篇随笔&#xff0c;完成初步的需求分析&#xff1a; 1.访问软件项目的真实用户&#xff08;至少10个&#xff09;&#xff0c;…

给div命名,使逻辑更加清晰

我们把一些标签放进<div>里&#xff0c;划分出一个独立的逻辑部分。为了使逻辑更加清晰&#xff0c;我们可以为这一个独立的逻辑部分设置一个名称&#xff0c;用id属性来为<div>提供唯一的名称&#xff0c;这个就像我们每个人都有一个身份证号&#xff0c;这个身份…

css边框颜色渐变

在实际开发中&#xff0c;我们经常遇见边框需要背景渐变的实现要求&#xff0c;那么如何去实现呢&#xff0c;今天给大家分享依稀几种情况 1.直角的背景渐变 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta…