【openJDK系列3】java OOM 分析(mat工具的使用)
背景
在java应用开发中 我们难免会遇到java stack和heap的分析,在此记录一下对于发生OOM时候,该怎么进行分析
分析
- 首先我们得会几个工具,
jps
jmap -heap
jmap -histo:live
jmap -dump:format=b,file=dump.hprof
mat(Memory Analyzer Tool)
- jps 用来看运行的应用是哪个pid
- jmap -heap 用来查看该应用堆内存总体分布情况
- jmap -histo:live 用来查看
- jmap -dump 用来dump 应用整个堆的明细情况,便于具体分析oom的对象
- mat 用来分析dump出来的文件的可视化软件,下载网址,根据自己的系统进行安装对应的软件就行
举个例子
$ jps
8727 DemoApplication
7914 Jps
$ jmap -heap 8727
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GCHeap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 1073741824 (1024.0MB)NewSize = 1073676288 (1023.9375MB)MaxNewSize = 1073676288 (1023.9375MB)OldSize = 65536 (0.0625MB)NewRatio = 2SurvivorRatio = 1MetaspaceSize = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize = 17592186044415 MBG1HeapRegionSize = 0 (0.0MB)Heap Usage:
New Generation (Eden + 1 Survivor Space):capacity = 715784192 (682.625MB)used = 463683480 (442.2030258178711MB)free = 252100712 (240.4219741821289MB)64.7797877045041% used
Eden Space:capacity = 357892096 (341.3125MB)used = 357892096 (341.3125MB)free = 0 (0.0MB)100.0% used
From Space:capacity = 357892096 (341.3125MB)used = 105791384 (100.8905258178711MB)free = 252100712 (240.4219741821289MB)29.559575409008193% used
To Space:capacity = 357892096 (341.3125MB)used = 0 (0.0MB)free = 357892096 (341.3125MB)0.0% used
concurrent mark-sweep generation:capacity = 65536 (0.0625MB)used = 65536 (0.0625MB)free = 0 (0.0MB)100.0% used
这里我们能看到jvm队的各个分区的内存大小以及使用情况,以及堆的配置情况
为了分析导致OOM的对象,执行
$jmap -histo:live 8727num #instances #bytes class name
----------------------------------------------1: 105666 12543792 [C2: 5671 2608472 [B3: 104224 2501376 java.lang.String4: 17232 1902336 java.lang.Class5: 55156 1764992 java.util.concurrent.ConcurrentHashMap$Node6: 19700 1733600 java.lang.reflect.Method7: 20805 1210960 [Ljava.lang.Object;8: 27 885168 [Ljava.util.concurrent.ForkJoinTask;9: 19971 798840 java.util.LinkedHashMap$Entry10: 9524 710520 [Ljava.util.HashMap$Node;11: 20654 660928 java.util.HashMap$Node12: 10754 602224 java.util.LinkedHashMap13: 319 530688 [Ljava.util.concurrent.ConcurrentHashMap$Node;14: 27608 441728 java.lang.Object15: 6672 351288 [I16: 13947 307648 [Ljava.lang.Class;17: 10444 250656 java.util.ArrayList18: 3884 217504 java.lang.invoke.MemberName19: 4444 175624 [Ljava.lang.String;20: 4328 173120 java.lang.ref.SoftReference21: 3317 159216 java.util.HashMap22: 105 137344 [J23: 5262 126288 org.springframework.core.MethodClassKey24: 1447 115760 java.lang.reflect.Constructor25: 3580 114560 java.util.LinkedList26: 1491 107352 org.springframework.core.annotation.AnnotationAttributes27: 1079 103584 org.springframework.beans.GenericTypeAwarePropertyDescriptor28: 2540 101600 java.lang.invoke.MethodType29: 3154 100928 java.lang.ref.WeakReference30: 2437 97480 java.util.TreeMap$Entry31: 3018 96576 java.lang.invoke.DirectMethodHandle32: 1450 92800 java.net.URL33: 3791 90984 sun.reflect.generics.tree.SimpleClassTypeSignature34: 2546 81472 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry35: 3175 76200 java.util.LinkedList$Node36: 3791 72048 [Lsun.reflect.generics.tree.TypeArgument;37: 2951 70824 java.beans.MethodRef
其中,
num 代表占用字节的大小排名
instances 代表实例的数目
bytes 代表占用的字节数
class name的具体含义如下:
B代表byte
C代表char
D代表double
F代表float
I代表int
1J代表long
Z代表boolean
前边有[代表数组,[I 就相当于int[]
这里其实就能看出个到底是哪个对象占用了太多导致了OOM
为了进一步分析,我们得dump出具体的堆明细
jmap -dump:live,format=b,file=dump.hprof
拿到dump.hprof文件,我们假设你已经安装了mat(如安装出现问题见下方注意),
- 按照 文件-》open heap Dump,倒入文件
- 选择Leak Suspects Report
- 选择Overview下的Histogram可以看到每个类的实例的数量大小,默认按照数量大小从大到小排列
- 选择你认为有可能OOM的对象,右击,选择List objects -》 with incoming references,则可以看到对应的代码的调用情况
注意:
如果在运行mat的过程中出现
java.lang.IllegalStateException: The platform metadata area could not be written: /private/var/folders/1l/mwvs7rf563x72kqcv7l6rb840000gn/T/AppTranslocation/F5D8FB45-D694-4157-BDAF-1D58A9B350BC/d/mat.app/Contents/MacOS/workspace/.metadata. By default the platform writes its content
under the current working directory when the platform is launched. Use the -data parameter to
specify a different content area for the platform.
找到对应mat下的Contents/Eclipse/MemoryAnalyzer.ini文件
增加
-data
## /Users/path/to/dir为可写权限的目录
/Users/path/to/dir
即可解决
【openJDK系列3】java OOM 分析(mat工具的使用)相关推荐
- JAVA Heapdump分析和工具——MAT
下载地址:http://www.eclipse.org/mat/downloads.php 打开dump文件出错解决方法: An internal error occurred during: &qu ...
- Jvm 系列(五):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- java oom分析_作为测试你应该知道的JAVA OOM及定位分析
上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...
- java oom分析_OOM分析
1.OOM类型 OOM,即OutOfMemory,内存溢出,原因是:分配的太少:用的太多:用完没释放. 内存泄漏:内存用完没有被释放.大量的内存泄漏就会导致OOM,也就是内存溢出. 常见的OOM情况有 ...
- jvm系列(五):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- java oom分析_Java OOM 分析
什么是 OOM 在 Java 中,OOM 是 java.lang.OutOfMemoryError 异常的缩写,简单来说是应用的内存用完了. 而这个内存,指代的是 JVM 管理的内存模型. JVM 内 ...
- java dump分析工具_java性能分析与常用工具
本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...
- 字节跳动应用性能监控帮助客户Java OOM崩溃率下降80%
一.前言 如何定位和解决 Android App 因为内存不足(Java OOM)引发的线上问题一直是业界的难题.崩溃现场能抓取到的常规信息中并不包括内存分配详情--不了解内存被谁持有,自然也无法追查 ...
- Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用
详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...
- mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...
最新文章
- map和vector的迭代器失效问题(某公司招聘笔试试题)
- Boost Asio总结(4) io_service
- 深入理解JavaScript系列(33):设计模式之策略模式
- C#中二进制和流之间的各种相互转换
- 【剑指offer】_11整数中1出现的次数
- ubuntu10.04添加账户示例
- seata使用报错no available service found in cluster ‘default‘
- 初学者python笔记(内置函数_1)
- 前端小秘密系列之闭包
- 携程的 Dubbo 之路
- r语言 回归分析 分类变量_R语言进阶之广义线性回归
- coco 数据集_如何用 coco 数据集训练 Detectron2 模型?
- ubuntu16.04安装天气预报软件
- Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
- mysql实用教程的数据构造
- UART、RS232、RS485协议简单总结
- xpath中的position()函数使用
- CPU与GPU计算能力比较
- day3----部署duboo微服务值部署zk和Jenkins(3)
- IE浏览器登录Tomcat报错