背景

在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工具的使用)相关推荐

  1. JAVA Heapdump分析和工具——MAT

    下载地址:http://www.eclipse.org/mat/downloads.php 打开dump文件出错解决方法: An internal error occurred during: &qu ...

  2. Jvm 系列(五):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  3. java oom分析_作为测试你应该知道的JAVA OOM及定位分析

    上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...

  4. java oom分析_OOM分析

    1.OOM类型 OOM,即OutOfMemory,内存溢出,原因是:分配的太少:用的太多:用完没释放. 内存泄漏:内存用完没有被释放.大量的内存泄漏就会导致OOM,也就是内存溢出. 常见的OOM情况有 ...

  5. jvm系列(五):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. java oom分析_Java OOM 分析

    什么是 OOM 在 Java 中,OOM 是 java.lang.OutOfMemoryError 异常的缩写,简单来说是应用的内存用完了. 而这个内存,指代的是 JVM 管理的内存模型. JVM 内 ...

  7. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  8. 字节跳动应用性能监控帮助客户Java OOM崩溃率下降80%

    一.前言 如何定位和解决 Android App 因为内存不足(Java OOM)引发的线上问题一直是业界的难题.崩溃现场能抓取到的常规信息中并不包括内存分配详情--不了解内存被谁持有,自然也无法追查 ...

  9. Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

    详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题. MAT(Memory Analyzer Too ...

  10. mat工具MemoryAnalyzer进行分析java内存溢出hprof文件

    java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...

最新文章

  1. map和vector的迭代器失效问题(某公司招聘笔试试题)
  2. Boost Asio总结(4) io_service
  3. 深入理解JavaScript系列(33):设计模式之策略模式
  4. C#中二进制和流之间的各种相互转换
  5. 【剑指offer】_11整数中1出现的次数
  6. ubuntu10.04添加账户示例
  7. seata使用报错no available service found in cluster ‘default‘
  8. 初学者python笔记(内置函数_1)
  9. 前端小秘密系列之闭包
  10. 携程的 Dubbo 之路
  11. r语言 回归分析 分类变量_R语言进阶之广义线性回归
  12. coco 数据集_如何用 coco 数据集训练 Detectron2 模型?
  13. ubuntu16.04安装天气预报软件
  14. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
  15. mysql实用教程的数据构造
  16. UART、RS232、RS485协议简单总结
  17. xpath中的position()函数使用
  18. CPU与GPU计算能力比较
  19. day3----部署duboo微服务值部署zk和Jenkins(3)
  20. IE浏览器登录Tomcat报错

热门文章

  1. MQL5 编程基础:数组
  2. html中选择收货地址时候,选择收货地址.html
  3. UV的入门使用方法,简单,快捷,包教包会
  4. [Houdini 程序化生成] 基于UV的生成工具
  5. Ubuntu 16.04 安装VSCode
  6. JAVA远程声卡,Delphi带多声道声卡(ASIO)
  7. Jtopo对象属性大全
  8. 如何绕过开机密码开启计算机,win10怎么绕过开机密码,win10如何强制跳过密码
  9. 微信小程序 图片处理:压缩、上传、审核
  10. 基于FFmpeg的简单Android视频播放器