目录
打印日志---->获取dump文件---->MAT分析---->修改验证
一 、如何制造OOM?
这里采用的方法是不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清理这些对象,就会在对象数量达到最大堆容量限制后产生OOM
public class GcDemo {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<>();
while(true){
list.add(new OOMObject());
}
}
}
二、操作部分:
- 设置jvm运行参数,目的是让jvm发生OOM时生成jump文件(文件后缀是.hprof)
- 项目发送OOM时,会在日志提示错误信息并打印dump文件名称
- 使用jdk自带工具jvisualvm来解析dump文件从而修改验证
使用jvisualvm来分析dump文件:
jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jvisualvm.exe。
jvisualvm可以监控本地、远程的java进程,实时查看进程的cpu、堆、线程等参数,对java进程生成dump文件,并对dump文件进行分析。
像我这种从服务器上dump下来文件也可以直接扔给jvisualvm来分析。
使用方式:直接双击打开jvisualvm.exe,点击文件->装入,在文件类型那一栏选择堆,选择要分析的dump文件,打开。
jvm参数设置参考:
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-Xmx20m
-Xms20m
-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpBeforeFullGC
-XX:+HeapDumpAfterFullGC
-XX:HeapDumpPath:自己的存储路径
* 在idea中打开项目的根目录
* 项目发生OOM之后,控制台的日志和出现在根目录下的dump文件
* 找到jdk的bin目录下的jvisualvm,载入dump文件
* 其他:如何找到jdk安装路径?
可以在idea的配置找,或者查看下电脑的环境变量当时是怎么配置的java环境变量的
三、使用MAT工具
我直接给了软件解压就行 :
链接:https://pan.baidu.com/s/1RsiaSdzMVIdMxoTQyDnk-Q
提取码:yyds
点击那个MemoryAnalyzer.exe启动MAT
导入后,强出上面的对话框:
Leak Suspects Report: 漏洞疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集;
Component Report: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等
Re-open previously run reports: 打开以前的运行报告;
选择Leak Suspects Report,点击完成;