利用Memory Dump Diagnostic for Java (MDD4J)分析内存管理问题

简介

这一部分是 Java 内存转储诊断 (MDD4J) 故障排除工具的简介,这种工具可帮助您分析 Java 堆,从而诊断内存占用问题。MDD4J 的分析结果在报告中提供,此报告汇总了应用程序使用 Java 堆的情况。

共有三种适合使用 MDD4J 提供帮助的场景:

内存泄漏:如果应用程序出现 java.lang.OutOfMemoryError 异常,或者详细的垃圾收集数据显示内存消耗逐渐增加,那么 MDD4J 可以指出造成此类增加的数据结构以及这些数据结构内的组件。

过度的内存消耗:如果一个应用程序未能很好地伸缩,或者所占用的内存比实现其所需任务占用的必要内存多,MDD4J 可为您显示占用过多内存的数据结构的高级说明。MDD4J 报告可为您显示集合的实现和其他类型的数据建模是怎样造成过度内存消耗的。

回归测试:MDD4J 提供的各种分析和数据结构视图可在修订 bug、添加或删除新特性时,帮助您跟踪内存消耗的更改。

MDD4J 可通过 IBM Support Assistant 获得。由于内存堆分析要占用大量处理器和 I/O 资源,您还可以在 IBM Support Assistant 工作台之外运行它。在服务器类机器上执行内存堆分析——特别是 64 位机器,允许您处理无限大小的内存堆,并为您的工作站保留大量资源,使您能够执行其他任务。

MDD4J 设计目标是提供足够的信息,帮助您识别问题,而不产生信息过载的问题。它并未提供深入、低级的专家功能,即手动检查堆内的整个对象图。如需获得深入的堆转储分析,可以使用 IBM Monitoring and Diagnostic Tools for Java – Memory Analyzer。

什么是堆转储?

堆转储也称为堆快照,就是内存中对象之间的参照转储,以及关于这些对象的信息。堆转储不包含变量名、值或源代码等信息。

在执行堆分析之前,需要一个堆转储。有三种方法可生成堆转储:

自动:JVM 通常会在用尽内容和崩溃时生成堆转储。

手动:可以向 JVM 发送一个信号,要求 JVM 生成堆转储。(MDD4J 文档具有关于如何在各种平台上生成堆转储的信息)。

编程:IBM SDK for Java 包含一个 com.ibm.jvm.Dump 类。使用其静态方法可以在您的应用程序运行的过程中生成堆转储。

如何分析堆转储

MDD4J 为堆转储文件使用不同的术语,以其获得的时间为依据:

基准堆转储

尽管 JVM 在崩溃时生成堆转储,但您可以将其与在应用程序启动后获取的堆转储相比较,进一步了解内存是如何使用的。这个在应用程序生命周期的早期获取的堆转储称为基准堆转储,可在执行比较分析时使用。

时间: 2024-08-07 06:59:34

利用Memory Dump Diagnostic for Java (MDD4J)分析内存管理问题的相关文章

利用数据结构的想法用java编写学生成绩管理

问题描述 利用数据结构的想法用java编写学生成绩管理 利用数据结构的想法用java编写学生成绩管理这样的大作业,要全部源代码和类 解决方案 其实有很多java书上都有这个例子的实例,你又何必在这里做伸手党呢?到时候照着书上慢慢敲代码慢慢测试,自己能学到东西多好呢? 解决方案二: 数据结构?java对数据结构弱化了很多,很多常用的数据结构,java都做了封装,直接使用就可以了

Java虚拟机自动内存管理

生活规律告诉我们,在享受便利的同时一般都会付出巨大的代价,如果你在享受了便利的同时,还没有为此付出代价,不是说明没有,只是还没到付出的时候.试问,有哪个Java系统架构师不懂Java虚拟机?纵观Java程序员的发展历程,又有多少人是卡在了Java虚拟机之上.所以如果你还没有感觉到为此付出代价,说明你已经Java虚拟机的糖衣炮弹所击中,且被毒害之深.Java的自动内存管理就是这样,像毒药一样,一旦上瘾就很难戒掉,而且会沉迷于此.而正确的做法就是了解其原理,拿到尚方宝剑,当虚拟机不好好为你提供服务时

Java进阶10 内存管理与垃圾回收

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   整个教程中已经不时的出现一些内存管理和垃圾回收的相关知识.这里进行一个小小的总结. Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域.   栈 栈的基本概念参考纸上谈兵: 栈 (stack).许多语言利用栈数据结构来记录函数调用的次序和相关变量(参考Linux从程序到进程). 在Java中,JVM中的栈记录

JVM内存管理:JAVA语言的内存管理概述

引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不

Java语言中内存管理的几个技巧

Java做的系统给人的印象是什么?占内存!说道这句话就会有N多人站出来为java辩护,并举出一堆的性能测试报告来证明这一点. 其实从理论上来讲java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么N多理由来证明它确实占内存呢?两个字,陋习. (1)别用new Boolean(). 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如: ps.s

Java实时应用程序中的内存管理

使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理. 这是通过让Java运行时对不再使用的Java对象进行垃圾收集而实现的. 垃圾收集是一个比较复杂的过程.通常,Java运行时会遍历堆,检查不再被其他对象引用.从而可以安全删除的对象,然而,由于垃圾收集占用CPU周期,所以它可能会影响应用程序代码的执行.即,如果在执行应用程序代码的过程中执行垃圾收集,则应用程序代码的响应时间可能延长.这会导致用户事务延迟的延长.更为糟糕的是,因为用户不知道何时会进行垃圾

java内存管理(堆、栈、方法区)

java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁

使用Memory Analyzer tool(MAT)分析内存泄漏(二)

[本文转载于使用Memory Analyzer tool(MAT)分析内存泄漏(二)] 前言 在使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单,很容易找出问题,但我期待借此举一反三.一开始不得不说说ClassLoader,本质上,它的工作就是把磁盘上的类文件读入内存,然后调用java.lang.ClassLoader.defineClass方法告诉系统把

利用性能探测器分析内存泄漏

在之前发表的文章"如何使用性能探测器的 *STATS和*PROFILE/PGM功能"里面,我解释了性能探测器的*STATS和*PROFILE数据集合类型,使用这两种集合类型可以非常便捷的进行数据收集,并能很容易的分析出CPU时间被哪些地方所使用.在这篇文章里,我将切换一下角度,去集中分析内存泄漏问题.内存泄漏是指那些在堆里分配的.但是无法被释放或者无法被重新分配的内存.这是在C/C++代码中很常见的问题,通常是由于程序员的疏忽,导致应用程序在进入某个异常甚至是正常的分支时没能正确的释放