jmap MAT内存溢出实践

一、创建Spring Boot工程

进入https://start.spring.io/网站,配置如下图

点击创建工程,然后用Idea或者Eclipse打开

二、创建模拟Heap内存溢出的代码

1、创建MemoryController类

2、创建User类

public class User {
private int id;
private String name; public User(int id, String name) {
this.id = id;
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

  

3、 设置最大内存和最小内存为32M

-Xmx32M -Xms32M

4、运行工程

http://127.0.0.1:8080/heap

出现内存溢出

三、创建模拟非Heap内存溢出

1、引入asm

		<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>

  

2、创建Metaspace类

/**
* https://blog.csdn.net/bolg_hero/article/details/78189621
* 继承ClassLoader是为了方便调用defineClass方法,因为该方法的定义为protected
*/
public class Metaspace extends ClassLoader{ public static List<Class<?>> createClasses() {
// 类持有
List<Class<?>> classes = new ArrayList<Class<?>>();
// 循环1000w次生成1000w个不同的类。
for (int i = 0; i < 10000000; ++i) {
ClassWriter cw = new ClassWriter(0);
// 定义一个类名称为Class{i},它的访问域为public,父类为java.lang.Object,不实现任何接口
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
"java/lang/Object", null);
// 定义构造函数<init>方法
MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
"()V", null, null);
// 第一个指令为加载this
mw.visitVarInsn(Opcodes.ALOAD, 0);
// 第二个指令为调用父类Object的构造函数
mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
"<init>", "()V", false);
// 第三条指令为return
mw.visitInsn(Opcodes.RETURN);
mw.visitMaxs(1, 1);
mw.visitEnd(); Metaspace test = new Metaspace();
byte[] code = cw.toByteArray();
// 定义类
Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
classes.add(exampleClass);
}
return classes;
} }

  

3、创建调用方式

    private List<Class<?>>  classList = new ArrayList<>();

  

    /**
* -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
*
* @return
*/
@GetMapping("/nonheap")
public String nonheap(){
while (true){
classList.addAll(Metaspace.createClasses());
}
}

  

4、设置JVM参数

-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M

5、启动调用

http://127.0.0.1:8080/nonheap

发现内存溢出

Exception in thread "http-nio-8080-exec-4" java.lang.OutOfMemoryError: Metaspace

四、解决方法

如果生成环境出现内存溢出,应该如何解决呢

1、导出内存映像文件

1)内存溢出自动导出

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./

配置如下

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

然后调用http://localhost:8080/heap

显示hprof文件已经生成了

2)使用jmap命令手动导出

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

15296是tomcat的进程。 这样就生成了一个heap.hprof 文件

jmap -heap 5579 查看内存的使用,每个区块占有多少内存(5579是tomcat的进程)

2、MAT分析内存映像文件

现在MAT工具 http://www.eclipse.org/mat/downloads.php

我这里下载的是Windows (x86_64)版本

然后使用这个工具打开刚才生成的hprof文件

jmap MAT内存溢出实践的更多相关文章

  1. [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出

    在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...

  2. JVM系列(2)- jmap+mat实战内存溢出

    熟悉几个监控JVM的常用命令 1. jps -l 查出当前服务器运行的java进程 --- 2. jinfo用法(结合jps -l查到进程ID) 1).查看最大堆内存:jinfo -flag MaxH ...

  3. JVM探秘:MAT分析内存溢出

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...

  4. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

  5. jmap的使用以及内存溢出分析

    一.jmap的使用以及内存溢出分析 前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总.对内存溢出的定位与分析 1.查看内存使用情况 jma ...

  6. java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  7. JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

    套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...

  8. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  9. Eclipse MAT和jvisualvm分析内存溢出

    ---------------------------------------------mac os版------------------------------------------------ ...

随机推荐

  1. Ubuntu配置静态IP

    1. 输入命令:sudo vi /etc/network/interfaces 编辑文件: auto lo iface lo inet loopback auto eth0 iface eth0 in ...

  2. crontab的定时任务实例

    实例1:每1分钟执行一次myCommand * * * * * myCommand 实例2:每小时的第3和第15分钟执行 3,15 * * * * myCommand 实例3:在上午8点到11点的第3 ...

  3. mysql创建用户并给用户分配权限

    1.登录Mysql [root@xufeng Desktop]# mysql -u root -pEnter password: Welcome to the MySQL monitor. Comma ...

  4. array_reverse()函数

    $a=array(1,2,4,5,6); print_r(array_reverse($a)); 结果:Array ( [0] => 6                              ...

  5. 安装mongodb的msi步骤

    1.首先从官网 http://www.mongodb.org/download 中下载最新的mongodb的文件包 (本人用的是msi文件) 2.打开msi文件,按照步骤依次完成 3.指定服务器端映射 ...

  6. 计时器---JS

    <script type="text/javascript"> function count(){ var a=document.getElementById(&quo ...

  7. linux最常用的20个命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  8. 20155219 2016-2017-2 《Java程序设计》第10周学习总结

    20155219 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 教材学习内容总结 Java的网络编程 网络编程 网络编程就是在两个或两个以上的设备(例如计 ...

  9. ROI-Align解决方案

    https://yq.aliyun.com/articles/558181 Mask R-CNN与Faster R-CNN相似,Faster R-CNN是two-stage的,其中第一个stage是R ...

  10. Windows 10下使用WMware 12 安装Ubuntu16.04,安装过程(附全过程图)

    序言:菜鸡的我又开始瞎搞Ubuntu了 首先在网下下载VMware 12 正常安装即可 关于产品密匙问题:5A02H-AU243-TZJ49-GTC7K-3C61N (这是我在网上找的密匙,反正自己是 ...