jmap MAT内存溢出实践
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内存溢出实践的更多相关文章
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- JVM系列(2)- jmap+mat实战内存溢出
熟悉几个监控JVM的常用命令 1. jps -l 查出当前服务器运行的java进程 --- 2. jinfo用法(结合jps -l查到进程ID) 1).查看最大堆内存:jinfo -flag MaxH ...
- JVM探秘:MAT分析内存溢出
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory A ...
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程
老李案例分享:MAT分析应用程序服务出现内存溢出过程 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...
- jmap的使用以及内存溢出分析
一.jmap的使用以及内存溢出分析 前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总.对内存溢出的定位与分析 1.查看内存使用情况 jma ...
- java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架
产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...
- java内存溢出分析工具:jmap使用实战
在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...
- Eclipse MAT和jvisualvm分析内存溢出
---------------------------------------------mac os版------------------------------------------------ ...
随机推荐
- 使用std::map和std::list存放数据,消耗内存比实际数据大得多
使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...
- Day9作业及默写
1,整理函数相关知识点,写博客. 2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def func(obj): return obj[1::2] 3, ...
- vue安装流程
一.环境搭建 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器.由于国内使用npm会很慢,这 ...
- shell 中变获取值及运算的几种方法
num=$(tail ./image/1.txt -n 1) num=$(($num+1))
- flask中利用from来进行对修改修改时旧密码的验证
在flask中,肯定是post提交个from进行密码验证.还有一定就是修改密码肯定是登录之后才能进行对密码的修改,这么说,在浏览器中的session中一定会有用户的信息,可以通过相对应的信息去获取到相 ...
- numpy unable to find vcvarsall.bat
出现这种情况,是需要引用vc的编译器,可以安装vs来解决,并且安装numpy前, 设置如下宏 SET VS100COMNTOOLS=%VS110COMNTOOLS% SET VS90COMNTOOLS ...
- vmware如何安装ubuntu
一.安装vamware 二.新建虚拟机 三.安装虚拟机的镜像文件 三.正式安装ubuntu 可能会出现的问题有: 下面为百度上的方法: 敲重点: 倘若按照网上的方法:关机重启按F2无法进入BIOS.则 ...
- centos 端口开放及关闭 【转】
之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.因为以前部署在Win Ser ...
- C++学习(三十一)(C语言部分)之 栈和队列(括号匹配示例)
括号匹配测试代码笔记如下: #include<stdio.h> #include<string.h> #include <stdlib.h> #define SIZ ...
- ACM-ICPC 2018 北京赛区网络预赛(9.22)
#include<bits/stdc++.h> using namespace std; ; *maxn]; *maxn]; *maxn]; int main() { int T; sca ...