利用MemoryAnalyzer进行OutOfMemoryError的诊断分析
这篇帖子只介绍利用MemoryAnalyzer进行简单的JVM的堆的分析,至于JVM的内部结构是怎么样的,这里不进行分析。好吧,废话不多说;首先如果我们要分析JVM某个时刻的Heap的对象分配情况,我们就必须要dump这个时刻的JVM的heap(堆);有以下几个办法进行dump某个时刻JVM的heap内容:
1、 使用$JAVA_HOME/bin/jmap -dump来触发,
eg:jmap-dump:format=b,file=/home/longhao/heamdump.out <pid>
2、 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在 java应用的根目录下面。
3、在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。
4、使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
利用MemoryAnalyzer进行Heap分析
去eclipse官网上去下载MemoryAnalyzer,可以下载非插件版的,这样MemoryAnalyzer运行起来比较快,如果是eclipse插件版进行可能会导致eclipse卡死。本人下载的版本是MemoryAnalyzer-1.2.0.20120530-win32.win32.x86_64。
一、Java代码样例
[java] view plaincopy
- package org.ph.javaee.javaheap;
- import java.util.Map;
- import java.util.HashMap;
- /**
- * JVMOutOfMemoryErrorSimulator
- *
- * @author PH
- *
- */
- public class JVMOutOfMemoryErrorSimulator {
- private final static int NB_ITERATIONS = 500000;
- // ~1 KB data footprint
- private final static String LEAKING_DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata";
- // Map used to stored our leaking String instances
- private static Map<String, String> leakingMap;
- static {
- leakingMap = new HashMap<String, String>();
- }
- public static void main(String[] args) {
- System.out.println("JVM OutOfMemoryError Simulator 1.0");
- System.out.println("Author: Pierre-Hugues Charbonneau");
- System.out.println("http://javaeesupportpatterns.blogspot.com/");
- try {
- for (int i = 0; i < NB_ITERATIONS; i++) {
- String data = LEAKING_DATA_PREFIX + i;
- // Add data to our leaking Map data structure...
- leakingMap.put(data, data);
- }
- } catch (Throwable any) {
- if (any instanceof java.lang.OutOfMemoryError) {
- System.out.println("OutOfMemoryError triggered! "
- + any.getMessage() + " [" + any + "]");
- } else {
- System.out.println("Unexpected Exception! " + any.getMessage()
- + " [" + any + "]");
- }
- }
- System.out.println("simulator done!");
- }
- }
二、设置JVM启动参数
在此我们把JVM堆的最大内存设置为512m,并且让程序运行过程中出现内存溢出的时候会dump当时的JVM对内存的内容,所以需要加上XX:+HeapDumpOnOutOfMemoryError参数;因此按照以下步骤在eclipse中加入启动参数


三、运行程序
运行程序,然后观察控制台的输出,输出结果如下:

从以上的输出结果来看,此程序已经抛出了OutOfMemoryError了,并且生成了一个heap文件,文件名为java_pid3880.hprof,下一步我们就可以拿这个文件在MemoryAnalyzer分析了。
四、导入heap文件分析
导入后按照以下步骤执行进行内存泄露的可疑分析;




鼠标点击红色的部分会出现菜单,选中菜单的第一行的List objects > With Incoming references,就会出现以下界面

此图展现了HashMap$Entry被引用的路径,HashMap$Entry被一个java.util.HashMap的table实例变量引用,而这个HashMap又被JVMOutOfMemberyErrorSimulator类变量leakingMap引用,所以通过这些路径就很容易找到是哪段代码导致的内存溢出。
通过以上分析我们就发现,类JVMOutOfMemberyErrorSimulator的leakingMap变量的内容太大导致了内存溢出,所以这样就能很快定位到问题。
其中注意Shallow vs. Retained Heap的区别,这里不进行解释,点击MemoryAnalyzer的Help菜单里面的HelpContents就可以查找到
这里解释下Java Local,JVM里面的类变量,实例变量的名字在JVM里面都有记录,而局部变量是没有记录的,所以Java Local在这里就代表局部变量。
总结:以上的这些分析方法是入门级别的,现实中的OOM分析肯定比这更复杂,本人就曾经遇到过很多诡异的OOM。但在一般情况下,如果出现OOM,那么我们肯定需要对JVM的heap进行分析,这篇帖子是一个很好的思维方法;当然你也可以利用其他的工具进行heap分析,但思路大概都差不多;MemoryAnalyzer是一个不错的工具,里面有很多的小工具给我分析,可以花点时间看看。
利用MemoryAnalyzer进行OutOfMemoryError的诊断分析的更多相关文章
- 利用 SysRq 键排除和诊断系统故障
说白了,SysRq手动触发而不用命令, /proc/sysrq-trigger 这个是通过命令接口 实验:LINUX窗口下 ,CTRL+ALT+F1,切换到TTY1,在文本模式下,按下 ALT+Sys ...
- 如何更好地利用Pmd、Findbugs和CheckStyle分析结果
这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下: Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可能的bug— ...
- 利用WebBrowser实现Web打印的分析
原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...
- gops —— Go 程序诊断分析工具
GitHub: https://github.com/google/gops 一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/googl ...
- 如何利用Flink实现超大规模用户行为分析
如何利用Flink实现超大规模用户行为分析 各位晚上好,首先感谢大家参与我的这次主题分享,同时也感谢 InfoQ AI 前线组织这次瀚思科技主题月! 瀚思科技成立于 2014 年,按行业划分我们是 ...
- 如何利用wireshark对TCP消息进行分析
原文:https://www.cnblogs.com/studyofadeerlet/p/7485298.html 如何利用wireshark对TCP消息进行分析 (1) 几个概念介绍 1 seq ...
- cognos服务器性能测试诊断分析优化过程记录
前段时间客户方一个系统上线后出现性能问题,就是查询报表的时候出现宕机现象,应项目组要求过去帮忙测试优化问题. 该项目的架构相对比较复杂,登录后要先进行认证服务器认证用户然后登录到应用系统A,在跳转到 ...
- mysql查询诊断分析工具
Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方.通常我们是使用的explain,以及slow query log都无法做到 ...
- Python中利用LSTM模型进行时间序列预测分析
时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...
随机推荐
- vim with space-vim
space-vim https://github.com/liuchengxu/space-vim macOS # homebrew /usr/bin/ruby -e "$(curl -fs ...
- IOS-5个可以帮你优化App的优秀网站
也许现在有一款App可以提供所有你需要的,你不需要的,或者你可以想象到的内容.但是,有多少App真的可以不仅满足需求而且还能提供很好的用户体验呢? 相信很多APP并没有这样的能力.有一些APP的设计特 ...
- 前端ps切图,图文教程,详细。
https://blog.csdn.net/OBKoro1/article/details/69817571 1.下载 我现在使用的版本号:PS-CS6,网上很多破解版本的自行搜索下载. 2.安装好P ...
- centos7.3安装配置vsftp
首先使用命令查看,系统内是否安装了vsftp [root@instance_290388 down]# rpm -qa |grep vsftp 如果没有安装,使用命令,进行安装 [root@insta ...
- ISE创建Microblaze软核(三)
第七步 进入SDK开发环境 编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录. 进入SDK主界面. ...
- python3 中文乱码,UnicodeEncodeError: 'latin-1' codec can't encode characters in position 10-13: ordinal not in range(256)
将其源代码复制下来运行之后,报了下面这个错误: UnicodeEncodeError: 'latin-1' codec can't encode characters in position 9-13 ...
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
本篇博客比较了常见的5种开源协议的异同,大家在为自己的代码选择协议的时候可以参考.现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http ...
- Jenkins使用Git Parameter插件打包
一. 下载Git Parameter插件: 二. 项目配置: Shell脚本: #!/bin/bash -l echo $deploy_envcase $deploy_env in deploy) e ...
- C#统计给定的文本中字符出现的次数,使用循环和递归两种方法
前几天看了一个.net程序员面试题目,题目是”统计给定的文本中字符出现的次数,使用循环和递归两种方法“. 下面是我对这个题目的解法: 1.使用循环: /// <summary> /// 使 ...
- Hibernate对象的三种状态,瞬时态、持久态、游离态
1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...