jmap+MAT实战内存溢出

一、堆区和非堆区

前言:
如果发生内存溢出,主要是通过内存映像文件,来查看到底是那些类,一直在占有没有释放。

  • 1.1 情况分析:

第一种内存溢出:有可能内存泄漏
第二种内存溢出:也有可能内存分配不足导致的

假若:内存泄漏,我们要找到是那个地方把它泄露出去了,一直占有没有释放。
java中的内存泄漏:指new了一个对象之后,一直不释放,这样的内存

  • 1.2 如何导出内存映像文件?
    • 1.2.1 内存溢出JVM自动导出:

当发生内存溢出的时候让jvm自动导出
设置参数:
#当发生内存溢出的时候,把HeapDump导出

-XX:+HeapDumpOnOutOfMemoryError

#当发生内存溢出的时候,把HeapDump出来的路径

-XX:HeapDumpPath=./
  • 1.2.2 使用jmap命令手动导出:

当发生内存溢出的时候,再去dump就有点晚了,当成程序运行一点时间后,我们用jmap手动导出内存映像文件,来具体分析:
执行命令:

jmap -dump:format=b,file=heap.hprof 3456

格式:jmap -dump:format=b,file=heap.hprof pid
命令行输出:

Dumping heap to C:\Users\Administrator.PC-20180929LWLP\Desktop\heap.hprof ...
Heap dump file created

看到以上提示,说明导出成功!!!

二、MAT分析dump文件

打开dump文件

三、案例演示

框架springboot
在浏览器地址栏输入:https://start.spring.io/

  • 3.1 生成一个springboot项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 3.2 解压压缩包
  • 3.3 在STS或eclipse或idea导入解压的项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 3.4创建一个MemoryController和User对象

实现原理:
因为controller不被回收,它里面的成员变量也 是不会被被回收的,这样就是导致list里面的对象越来越多,占得内存会越来越大,这样就会把我们这个内存撑爆了。

构造内存溢出
1.定义一个 list
2.通过一个循环不停地往这个list里面添加对象
在这里插入图片描述
3.5 启动项目,添加参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
浏览器验证:
http://localhost:8080/heap

控制台输出:
Exception in thread “http-nio-12345-exec-3” java.lang.OutOfMemoryError: GC overhead limit exceeded
模拟内存溢出自动导出:
在这里插入图片描述

-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

注:./指项目根目录
控制台输出:
在这里插入图片描述
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to ./\java_pid12468.hprof …
Heap dump file created [44843683 bytes in 0.270 secs]
在这里插入图片描述
mat分析dump文件:
mat下载地址:
https://www.eclipse.org/mat/downloads.php
在这里插入图片描述
在这里插入图片描述
双击打开
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

很明显在MemoryController中,有一个userList,在userList中User对象很多都没有释放。

CPU 线程 线程分析:
在这里插入图片描述
在这里插入图片描述
结果已经很明显了,解决方案就是:释放对象User就可以了
模拟使用jmap命令手动导出:

总结:理论上说:这2中都可以用,当内存很大的时候自动导出会导不出来,建议使用jmap手动导出即可

jmap -heap 3456
可以看到那一块具体用了多少

上面是导出内存映像文件,下面来用MAT
分析内存溢出,内存映像文件到底存了什么东西?如何利用内存映像文件来定位内存溢出呢?
https://www.eclipse.org/downloads/download.php

jstack pid > pid.txt
sz pid.txt
线程状态
top -p 15764 -H
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html

多么痛的领悟-代码优化导致的BUG
blog.csdn.net/goldenfish1919/article/details/8755378

nohup java -jar monitor_tuuning-0.0.1-SNAPSHOT.jar &

10.5.6.142:12345/loop
top命令查看cpu负载,load acerage:
cpu负载变大请求就进不来了
解决方案:
jstack pid > pid pid.txt
sz pid.txt :下载命令

top -p pid -H:打印所有线程,筛选出占用cpu比较多的线程,看看占用cpu线程在干什么?
printf “%x” pid :线程pid
命令行pid是十进制的,导出的jstack 文件时十六进制的
10.5.6.142/deadlock
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.5.6.120"

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.5.6.120"

nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.5.6.120 -jar monitor_tuuning-0.0.1-SNAPSHOT.jar &

tail -f nohup.out
jmap手动导出内存映像文件
命令行执行:
jmap -dump:format=b,file=heap.hprof 3456
格式:jmap -dump:format=b,file=heap.hprof pid
[root@localhost ~]# cd /app/nmonlogs/
[root@localhost nmonlogs]# ./nmon
按c查看CPU使用信息,按m查看内存使用信息,按n查看网络使用信息
c
jmap -dump:format=b,file=heap.hprof 31322

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

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

相关文章

Git 中文详细安装教程01(安装篇)

git官网:https://git-scm.com/ Step 1 Information Please read the following important information before continuing 继续之前,请阅读以下重要信息 Step 2 Select Destination Location 选择安装位置 Step 3 Select Components 选择组件 Step 4…

Windows OpenGL 波浪特效

目录 一.OpenGL 波浪特效效果演示 1.原始图片2.效果演示 二.OpenGL 波浪特效源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

阿里带火的中台,究竟是个啥?

戳蓝字“CSDN云计算”关注我们哦!来源:CIO发展中心中台这个概念早期是由美军的作战体系演化而来的,技术上所说的“中台”主要是指学习这种高效、灵活和强大的指挥作战体系。电商经过十几年的发展,组织已经庞大而复杂,业…

OpenGL 亮度调节

目录 一.OpenGL 亮度调节效果演示 1.IOS 演示效果2.Windows OpenGL ES 演示效果3.Windows OpenGL 演示效果 二.OpenGL 亮度调节源码下载 1.IOS Object-C 版本2.Windows OpenGL ES 版本3.Windows OpenGL 版本 三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 …

云漫圈 | 写给对 ”游戏开发” 感兴趣的朋友们

戳蓝字“CSDN云计算”关注我们哦!作者:小灰转自:程序员小灰我们程序员能为世界带来什么?有些程序员做出了 淘宝/Amazon,为世界带来了电子商务。有些程序员做出了 微信/Twitter,为世界带来了社交平台。而有些…

git下载安装、验证、企业实战单机、多人协作

此课程会划分为10个小结进行讲述 1 安装和配置2 创建仓库3 基本用法4 三种状态5 标签 tag6 分支 branch7 合并分支8 远程仓库9 如何多人远程合作 git下载安装验证 一、下载、安装、验证 1、git官网: https://git-scm.com/downloads 2、安装及配置 2-1 一路下一步…

Qt中线程的使用1

初学Qt线程,此实例只是对Qt单一线程的使用,另外结合信号槽实现ui界面与子线程之间数据的传输,可以解决线程在运行的过程中,关闭对话框程序崩溃的问题。此实例要实现的效果图如下: 界面控件的类,对象表如下…

Linux CentOS 6.8 安装 Docker

Linux CentOS 6.8 安装 Docker 一、移除Docker yum remove docker二、移除 Docker-selinux yum remove docker-selinux 三、修改Docker镜像配置文件 rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm四、安装Docker yum update -y …

爬取了10W条数据,我们整理出了这份北上广深租房图鉴

戳蓝字“CSDN云计算”关注我们哦!作者:AlfredWu 转自: Alfred数据室俗话说“金三银四”,又到了春招换工作、乃至换城市的时候了。这对于“回望楼价又一年”的小伙伴们来说,也意味着又到了搬家换房子的时候了。北上广深…

Windows OpenGL 图像亮度调节

目录 一.OpenGL 图像亮度调节 1.原始图片2.效果演示 二.OpenGL 图像亮度调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

Qt下继承于QObject创建的线程

Qt线程线程创建方法示例线程创建方法 Qt下创建线程的方法有两种: 一种是通过继承QThread,并重写run()函数,在run()函数中,编写线程所做的事情,在需要线程的文件中&#…

入门篇|学渣是如何自学数据结构的?

戳蓝字“CSDN云计算”关注我们哦!作者 | 小鹿来源 | 一个不甘平凡的码农写在前边-------------------------------------------今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。写这篇文章主要目的还是重在让刚刚接触数据结构的读者…

Qt下简单的文件读取

此示例只是一个简单的文件的打开&#xff0c;读取&#xff0c;文件内容的加载&#xff0c;望共勉。 界面效果展示 代码实现 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>namespace Ui { class Dialog; }class Dialog : public QDialog {Q_OBJECTpub…

趣挨踢 | 用大数据扒一扒蔡徐坤的真假流量粉

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;AlfredWu 转自&#xff1a; Alfred数据室前段时间央视新闻公开披露流量明星数据造假。作为一名数据猿&#xff0c;我们秉着好奇心点开了NBA新春贺岁形象大使蔡徐坤的微博&#xff0c;发现他的微博转发量除了最新一条…

Windows OpenGL ES 图像曝光度调节

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 转场 零基础 OpenGL ES 学习路线推荐…

C++中析构函数

析构函数&#xff1a; 1.析构函数不能被重载&#xff1b; 2.析构函数可以是虚函数&#xff1b; 3.析构函数没有参数&#xff0c;没有返回值&#xff1b; 4.当类对象的生命周期结束&#xff0c;系统会自动调用析构函数&#xff1b; 5.若没有显式的析构函数&#xff0c;系统会调用…

Jenkins进阶系列之——07更改Jenkins的主目录

Jenkins进阶系列之——07更改Jenkins的主目录 参考链接&#xff1a; https://blog.csdn.net/pansaky/article/details/80749567 Jenkins默认会存放在用户主目录下的.jenkins文件夹中 如&#xff1a;Linux root用户&#xff1a;/root/.jenkins 注意&#xff1a;这是linux版本的…

Windows OpenGL 图像曝光度调节

目录 一.OpenGL 图像曝光度调节 1.原始图片2.效果演示 二.OpenGL 图像曝光度调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Op…

kubernetes精华问答 | Swarm和K8S的共同点有哪些?

kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kubernetes提供了应…