精华内容
下载资源
问答
  • OOM排查工具

    2020-08-23 23:34:24
    工作中碰到了很多次OOM,因此需要去排查相关的问题。 使用过一些工具进行排查。 JVM自带的:jps、jstack、jstat、jmap、jhat等,...后续博文可以将OOM的一些情况整理出来,然后使用相关工具排查相关问题的过程。 ...

    工作中碰到了很多次OOM,因此需要去排查相关的问题。

    使用过一些工具进行排查。

    JVM自带的:jps、jstack、jstat、jmap、jhat等,本地使用jconsole、jvisualVM

    其他开源工具:MAT、greys、arthas、IBM HeapAnalyzer

    收费的:jprofile

    总的来说:HeapAnalyzer和arthas还会很不错的

    后续博文可以将OOM的一些情况整理出来,然后使用相关工具排查相关问题的过程。

    展开全文
  • OOM 排查 工具方法

    千次阅读 2017-05-04 09:49:03
    最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务...这次的问题稍微复杂一点,但是也比较有代表性,用到了VisualVM和MAT两个工具,继续记录如下。 现象 这次使用公司的CAT监控平台看到的内存表现如下:

    最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时。问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dump之后,经过一系列分析,终于解决问题。这次的问题稍微复杂一点,但是也比较有代表性,用到了VisualVM和MAT两个工具,继续记录如下。

    现象

    这次使用公司的CAT监控平台看到的内存表现如下:

    可以看到,具体表现是:

    1. 在很长一段时间内(数个小时),New GC比较频繁,Full GC较少(一小时个位数)。


    2. 过了某一时间点后,Full GC增加,New GC则减少。


    3. 将服务切换下线后,Memory Free逐渐回升,Full GC减少。


    然后观察某一时刻的JMAP histo的内容如下:

    num     #instances         #bytes  class name

    ----------------------------------------------

       1:       5958517     5840833584  [C

       2:         37983      706246056  [B

       3:       5960539      190737248  java.lang.String

       4:       1522282      126603936  [Ljava.lang.Object;

       5:       3692000       88608000  java.lang.Double


    可以看到"[C"即"char[]"占用内存达到了5.8G,它正是String的内部结构,换句话说,因为存在了大量的大String导致这个问题。


    联系运维进行了Heap Dump之后,就开始了分析的过程。因为服务器内存有8G,所以相应的DUMP也有8G,对分析也造成了一点小困难。


    下面是一些工具的使用过程,操作系统是OS X 10.8。


    使用VisualVM分析


    首先使用VisualVM对Heap Dump进行分析。分析需要比较大的内存,而VisualVM默认的内存是256M,所以需要先设置/Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf中的最大内存量,这里我们设置成了4G-J-Xmx4096m。

    好了,现在打开dump文件,整个分析过程共占用内存2G,仍然在可接受范围。之后分析内存,可以看到跟之前histo一样的类关系。

    不同的是,这时候可以点进去,查看具体的对象。这里看到,竟然有几个大的String占用了756M的内存,看来我们找到问题了。


    发现一个奇怪的现象:“计算保留大小”之后,这些String的保留大小都是0。


    保留大小是什么呢?


    它是分析工具从GC roots开始查找,找到的所有不会回收的对象,然后按照引用关系,计算出这个“对象以及它引用的对象”的内存大小。这里很有趣的是,这些对象的保留大小都是0。


    开始我甚至以为是工具出了问题,后来想想,其实答案很简单:这些大String是临时对象,没有什么对象持有它——通过分析这些String的依赖关系也说明了这一点。这些对象是可以被回收的,换句话说,并不是有明显的内存泄露。


    这个“没有对象持有的String”很有意思,让我想到了,会不会是log的过程中,产生了这个String?因为log的时候,会调用对象的toString()方法,而一个大对象的toString()可能是很大的。查看了一下String的内容,是[Class[field1=xxx,field2=yyy]]这种结构,几乎可以肯定是toString()的结果,那么我们现在只要查看一下具体的内容,到底是哪里太大就可以了。


    可惜的是,VisualVM里我尝试了各种方法,都没有办法Dump出这个对象的数据,甚至还尝试了VisualVM提供的OQL。


    OQL是一种类SQL的表达式,同时整合了一些Javascript的函数功能,但是它的缺点就是太慢了…最后尝试用OQL Dump对象未果。


    使用MAT分析


    转而尝试一下MAT。Eclipse MAT(Memory Analyzer Tool)是一个强大的内存分析工具,它可以方便的分析内存泄露的问题。实际使用之后,确实也感觉到比VisualVM更加强大一些。


    我们使用MAT打开Dump文件,这也是一个漫长的过程。与VisualVM不同的是,MAT分析的时候,会在本地产生几个临时文件保存分析结果,所以相应的内存占用会小一些(1G左右),第二次打开也会快很多。


    打开完成后,我们看到可以看到几个占用内存较大的对象,这就是最可疑的内存泄漏源。意外的是Size显示的只有1.3GB,而且我们的大String都没在里面。



    开始我们一度认为是Dump文件有错,后来上网搜索才知道,因为MAT的主要目标是排查内存占用量,所以默认大小是不计算不可达对象的——而我们的String都是不可达对象。对应Eclipse的文档里有介绍http://wiki.eclipse.org/MemoryAnalyzer/FAQ#How_to_analyse_unreachable_objects。


    于是我们按照说明,在"Preferences=>Memory Analyzer"中勾选"Keep Unreachable Objects",删除索引文件Dump同路径下的所有".index",即可看到所有的对象。


    点击Histogram,即可看到类的占用。在类上选择"List Objects",即可看到所有对象。在对象上选择"Copy=>Value to File",即可保存到文件。


    原理


    之后我们通过分析对象,发现是因为某个用于缓存的对象使用了一个List结构,但是添加元素的没有去重,导致List越来越大造成的。这个对象本身占用内存只有110M,但是toString()出来的字符串达到700M的大小,所以引起了频繁的GC——最开始对象小的时候是New GC,后来对象大了,直接进入了年老代,就变成了Full GC。


    总结

    回到之前的问题,通过这次分析,我们可以这么总结:


    1. 将服务切换下线后,Memory Free逐渐回升,Full GC减少,Heap Dump的可达对象较少。这种情况不是内存泄露,有可能是对象创建开销太大造成的。


    2. 在1的前提下,New GC很频繁。这种情况可能是频繁创建小对象,或者创建一些较大的对象(尚不足以直接进入年老代)


    3. 在1的前提下,Full GC很频繁。这种情况是频繁创建大对象,或者创建了一些超大对象导致的。


    4. 第3种情况下,大对象toString()产生的大String很可能是罪魁祸首。


         原网页:http://mp.weixin.qq.com/s/PoQOxQXGJ_QYNa_dxSORkg

    展开全文
  • OOM排查

    万次阅读 2019-06-13 15:35:32
    OOM排查过程步骤 1、先查看应用进程号pid: ps -ef | grep 应用名 2、查看pid垃圾回收情况:jstat -gc pid 5000(时间间隔) 即会每5秒一次显示进程号为68842的java进成的GC情况,显示内容如下图: 结果说明...

    OOM排查过程步骤

    1、先查看应用进程号pid:     ps  -ef | grep  应用名

    2、查看pid垃圾回收情况:  jstat  -gc  pid  5000(时间间隔)

    即会每5秒一次显示进程号为68842的java进成的GC情况,显示内容如下图:

    结果说明:显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):

    S0C:年轻代中第一个survivor(幸存区)的容量 (字节) 

    S1C:年轻代中第二个survivor(幸存区)的容量 (字节) 

    S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) 

    S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) 

    EC:年轻代中Eden(伊甸园)的容量 (字节) 

    EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) 

    OC:Old代的容量 (字节) 

    OU:Old代目前已使用空间 (字节) 

    PC:Perm(持久代)的容量 (字节) 

    PU:Perm(持久代)目前已使用空间 (字节) 

    YGC:从应用程序启动到采样时年轻代中gc次数 

    YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 

    FGC:从应用程序启动到采样时old代(全gc)gc次数 

    FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 

    GCT:从应用程序启动到采样时gc用的总时间(s) 

    NGCMN:年轻代(young)中初始化(最小)的大小 (字节) 

    NGCMX:年轻代(young)的最大容量 (字节) 

    NGC:年轻代(young)中当前的容量 (字节) 

    OGCMN:old代中初始化(最小)的大小 (字节) 

    OGCMX:old代的最大容量 (字节) 

    OGC:old代当前新生成的容量 (字节) 

    PGCMN:perm代中初始化(最小)的大小 (字节) 

    PGCMX:perm代的最大容量 (字节)   

    PGC:perm代当前新生成的容量 (字节) 

    S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 

    S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 

    E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 

    O:old代已使用的占当前容量百分比 

    P:perm代已使用的占当前容量百分比 

    S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节) 

    S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节) 

    ECMX:年轻代中Eden(伊甸园)的最大容量 (字节) 

    DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满) 

    TT: 持有次数限制 

    MTT : 最大持有次数限制 

    3、开启OOM快照: 

    -XX:+HeapDumpOnOutOfMemoryError(开启堆快照)

    -XX:HeapDumpPath=C:/m.hprof(保存文件到哪个目录)

    4、dump 查看方法栈信息:

    jstack -l  pid  >  /home/test/jstack.txt

    5、dump 查看JVM内存分配以及使用情况

    jmap  -heap  pid  >  /home/test/jmapHeap.txt

    6、dump jvm二进制的内存详细使用情况 (效果同在Tomcat的catalina.sh中添加 set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/test//oom.hprof  此文件需要借用内存分析工具如:Memory Analyzer (MAT)来分析)

    jmap -dump:format=b,file=/home/test/oom.hprof  pid

     

    OOM一般有以下两种情况:

    1、年老代堆空间被占满

    异常:java.lang.OutOfMemoryError:java  heap space

    说明:这是最典型的内存泄漏方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机再也无法分配新空间

    解决方案:这种方式解决起来比较简单,一般就是根据垃圾回收前后的情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点

    2、持久代被占满

    异常:java.lang.OutOfMemoryError:PermGen space

    说明:Perm 空间被占满,无法为新的 class 分配存储空间而引发的异常。这个异常以前是没有的,但是在 java 大量使用反射的今天这个异常就比较常见了。主要原因是大量动态反射生成的类不断被加载,最终导致 Perm 区被占满。更可怕的是,不同的 classLoader 即便使用相同的类,但是都会对其进行加载,相当于同一个东西,如果有 N 个classLoader 那么它将会被加载 N 次。因此,在某些情况下,这个问题基本视为无解,当然,存在大量 classLoader 和大量反射类的情况并不多

    解决方案:增加持久代内存 ,例如:-XX:MaxPermSize=16M

    展开全文
  • OOM排查步骤

    2021-10-09 18:34:43
    准备 1..hprof文档 通常在OOM时会记录内存情况供分析。启动时指定jvm参数 ...2.分析工具:MAT(Eclipse Memory Analysis Tools)免费。下载可能需要梯子。 分析 1.导入hprof文件 2.根据软件提示找.
    • 准备

    1..hprof文档 通常在OOM时会记录内存情况供分析。启动时指定jvm参数
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=D:\log\projects\donottouchme.hprof (可选)
    就见过OOM没hprof文件也没监控的,怎么死的都不知道,只能回家玩egg
    2.分析工具:MAT(Eclipse Memory Analysis Tools)免费。下载可能需要梯子。

    • 分析

    1.导入hprof文件
    2.根据软件提示找出异常内存的对象和线程
    3.根据情况改进,可能是框架使用姿势错误,或者代码需要优化,亦可能根本就是内存太小需要换电脑。

    展开全文
  • docker oom排查

    2021-08-16 19:22:20
    一个流量很小的列表查询应用报了docker oom, 和以往的jvm oom不一样。这个不能 直接打出来dump日志。 排查: 首先这个机器是2c 4g,堆内存大小到达3.92。堆外内存只有800m. 堆得大小已经超标了 首先判断是否因为内存...
  • OOM排查与定位

    千次阅读 2019-11-05 15:44:32
    某Java服务(假设PID=19813)出现了OOM,最常见的原因为: 有可能是内存分配确实过小,而正常业务使用了大量内存 某一个对象被频繁申请,却没有释放,内存不断...更具体的,可以使用以下工具逐一排查。 jps列出所有...
  • 一次应用OOM排查

    2016-07-01 15:17:31
    首页 登录 我的收藏 面试题 JAVA C++ Framework 其他译文 本站原创 ...一次应用OOM排查 一次应用OOM排查 前段时间系统经常出现OOM,每次出现之后系统会出现各种问题,临时解决方案只
  • OOM排查小案例

    2021-08-14 21:17:16
    写作目的 排查过某OOM问题吗?额。。。没有 参考 https://www.cnblogs.com/jiyukai/p/9292348.html https://blog.csdn.net/yinni11/article/details/82463844
  • 工作中遇到了OOM问题需要排查,在此做一下分享,也做一下笔记 这里模拟了工作中的OOM场景,实际代码就不拿出来了,... * @description OOM排查与优化 */ public class OptimizeOOM { public static void main(...
  • docker oom 排查过程

    千次阅读 2019-06-12 13:38:39
    在最近公司产品的一次release中,我们遇到了一个Java OOM的问题,追查了几个小时才解决问题,而且事后发现造成问题的原因很简单,但追查的过程我认为值得记录一下。 1. 现象 我们的应用是跑在64位的Red Hat ...
  • jvm OOM 排查

    2013-10-09 18:50:29
    最近公司的测试环境的Cassandra OOM了,借此机会顺便也回顾一下之前学习的JVM,在这总结一下。本文所指JVM是针对Sun的官方HotSpot VM。   首先了解一些基本JVM知识。 1、JVM主要内存结构  a、堆(heap)  堆...
  • 记Structured Streaming 2.3.1的OOM排查过程 缘起 最近在使用Structured Streaming开发一套自助配置SQL的来生成流式作业的平台,在测试的过程中发现有些作业长时间运行后会有Executor端的OOM,起初以为是代码的...
  • 常见OOM排查和处理

    2020-11-05 16:47:01
    总结一些常见OOM 1.java.lang.OutOfMemoryError: Java heap space 首先在错误提示那已经提示了OOM发生在堆空间里面,因为在本地idea,所以为了模拟这种情况配置了VM Options :-Xms10m -Xmx10m -XX:+PrintGCDetails ...
  • 一次OOM排查过程

    千次阅读 2017-02-19 10:17:11
    二、辅助工具 1.top 用top查看,发现内存占用(%MEM)挺多,其他指标均正常。   2.dmesg 如果发现自己的java进程突然消失了,那么就要借助dmesg来查看开机之后的系统日志 命令为dmesg | grep -i 'kill'或者...
  • 一次线上OOM排查总结

    2019-09-28 22:05:05
    现象 公司新上线的一个数据入库...排查过程 因为只有这个项目上出现这种情况,初步认为是该项目上数据量较大,调整了tomcat内存大小 打开tomcat的bin目录下的catalins.sh文件 在cygwin=false之上 添加以下语...
  • 没想到居然真的复现了,既然是排查OOM,就用java自带的VisualVM工具吧,需要初步排查是哪些对象占用了堆内存。 1、使用VisualVM排查jvm内存: (1)目录在C:\Program Files\Java\jdk1.8.0_144\bin下,有
  • 生产环境CPU100%、FGC频繁、服务OOM排查思路与具体实现
  • 一、OOM简介 以下为转载的一些知识点,这边主要是记录以下排查过程 1.jvm内存分配不够,电脑内存的大小,不等于java程序能够使用的内存大小。jvm分配的内存大小,可以在JVM启动时,通过配置文件配置。 2.内存利用...
  • 记一次 OOM 排查过程

    2020-05-17 19:53:16
    经过上面的分析,需要注意的是设置最大堆内存大小,因此设置 JVM 参数: -Xmx1024m 微观角度分析 扩大堆内存最大值可以解决 OOM 问题,但是我们并没有找到真正导致 OOM 问题的原因(当然在这个例子中的最大原因是 ...
  • OOM排查和出现的原因?

    2021-05-19 15:36:05
    1.导致OOM问题的原因 Java.lang.OutOfMemeoryError异常: 1.1Java堆溢出(Java.lang.OutOfMemeoryError:Java heap space) 新产生的对象最初分配在新生代,新生代满后会进行一次Minor GC,如果Minor GC后空间不足会把该...
  • 又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时。问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dump之后,经过一系列分析,...
  • 本文阐述分析了 Android 上面 OOM 出现的原因以及一些排查方法。并特别针对图片加载占用内存导致 OOM 的问题,提出了一些解决办法。
  • 在开发项目中发生了一次OOM问题,通过crash 平台查看上报信息,发现在很多的页面都有报这个错误,但是相同的出错都是以下的错误,看不到APP的堆栈只能看到是线程池创建有问题的堆栈信息,如下所示: java.lang....
  • 最近线上一个服务又出现了频繁...这次的问题稍微复杂一点,但是也比较有代表性,用到了VisualVM和MAT两个工具,继续记录如下。 现象 这次使用公司的CAT监控平台看到的内存表现如下: 可以看到,具体表现是:...
  • 记一次OOM排查过程(入门版)

    千次阅读 2019-06-06 10:43:14
    第一次线上遇到问题,最近也在学jvm,记录一下,算是一个入门版jvm故障排查,希望能给新手带来一点干货。 背景 机器 (2c8g) 默认jvm部分关键...HeapDumpOnOutOfMemoryError 这个是故障排查关键,会在OOM的时候生成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,123
精华内容 3,249
关键字:

oom排查工具