一次MAT分析logstash内存溢出

一、logstash启动时报OOM(内存溢出),导致logstash进程一直启动不了。解决方法,删除sincedb文件后再启动logstash。事后用Eclipse 的memory analyzer工具分析heapdump文件,第一次使用MAT分析问题,此次记录下这次使用MAT时一些东西。

1、heapdump :

 通过jvm参数--XX:-HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照;

2、MAT界面功能

一次MAT分析logstash内存溢出_第1张图片

 从上图可以看到它的大部分功能。
     1. Histogram可以列出内存中的对象,对象的个数以及大小。
     2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
     3.Top consumers通过图形列出最大的object。
     4.Leak Suspects通过MA自动分析泄漏的原因。


 Histogram如下图:
     Objects:类的对象的数量。
     Shallow size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。
     Retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。

一次MAT分析logstash内存溢出_第2张图片

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里的特殊节点GC Roots,就是reference chain的起点。(http://blog.csdn.net/xb151652000/article/details/8056792)
一次MAT分析logstash内存溢出_第3张图片 一次MAT分析logstash内存溢出_第4张图片
从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。 
所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算。

 Dominator Tree如下图:可以看到jruby类的线程占用了了很多的内存。

一次MAT分析logstash内存溢出_第5张图片


Top consumers如下:可以看出org.jruby.RubyObject对象占用了极大的内存以及该对象有极大的类数量。

一次MAT分析logstash内存溢出_第6张图片一次MAT分析logstash内存溢出_第7张图片一次MAT分析logstash内存溢出_第8张图片一次MAT分析logstash内存溢出_第9张图片一次MAT分析logstash内存溢出_第10张图片


Leak Suspects我们可以看到内存是由 org.jruby.RubyObject的实例消耗的,system class loader 负责这个对象的加载;下面应该进一步去分析问题,为什么org.jruby.RubyObject 会占据了系统如此多的内存?

一次MAT分析logstash内存溢出_第11张图片

  Problem Suspect 1

One instance of "char[]" loaded by "" occupies 198,214,576 (36.08%) bytes. The memory is accumulated in one instance of "char[]" loaded by "".

Keywords
char[]

Details »

  Problem Suspect 2

One instance of "org.jruby.RubyObject" loaded by ""occupies 101,415,560 (18.46%) bytes. The memory is accumulated in one instance of"byte[]" loaded by "".

Keywords
org.jruby.RubyObject
byte[]

Details »

  Problem Suspect 3

One instance of "org.jruby.RubyObject" loaded by ""occupies 101,302,352 (18.44%) bytes. The memory is accumulated in one instance of"byte[]" loaded by "".

Keywords
org.jruby.RubyObject
byte[]

Details »

  Problem Suspect 4

One instance of "org.jruby.runtime.ThreadContext" loaded by "" occupies 101,300,280 (18.44%) bytes. The memory is accumulated in one instance of "byte[]" loaded by "".

Keywords
org.jruby.runtime.ThreadContext
byte[]

Details »

 Hint 1

The problem suspects 1, 3 and 4 may be related, because the reference chains to them have a common beginning.

Details »

查看可疑对象org.jruby.RubyObject 的详细分析报告:

一次MAT分析logstash内存溢出_第12张图片

查看下从 GC 根元素到内存消耗聚集点的最短路径:

Shortest Paths To the Accumulation Point 
Class Name Shallow Heap Retained Heap
  • byte[101294942] @ 0xd32bc220 [2016-12-22 14:17:00.950] [INFO] [http-nio-8080-exec-57] [c.vip.goods.tools.controller.StockCheckController] >>> [method_execute] json={"startTime":"2016-12-22 14:15:54.309","className":"StockCheckController","endTime":"2016-12-22 14:16:57.510","methodName...
101,294,960 101,294,960
\
  • bytes org.jruby.util.ByteList @ 0xd31b9c98
40 101,295,000
.\
  • value org.jruby.RubyString @ 0xd31b9c70
40 101,295,040
..\
  • value org.jruby.RubyHash$RubyHashEntry @ 0xd31b9ea0
40 101,295,120
...\
  • nextAdded org.jruby.RubyHash$RubyHashEntry @ 0xd31bac90
40 40
....\
  • head org.jruby.RubyHash @ 0xd31ba570
56 101,295,888
.....\
  • [1] java.lang.Object[5] @ 0xd31b9f40
40 101,296,600
......\
  • varTable org.jruby.RubyObject @ 0xd17d9020
32 101,296,632
.......\
  • [0] org.jruby.runtime.builtin.IRubyObject[16] @ 0xd31bc090
80 101,296,712
........\
  • values org.jruby.RubyArray @ 0xd31bbaa0
48 101,296,760
.........\
  • value org.jruby.RubyHash$RubyHashEntry @ 0xd31baef8
40 101,296,984
..........\
  • nextAdded, prevAdded org.jruby.RubyHash$RubyHashEntry @ 0xd2334608
40 40
...........\
  • head org.jruby.RubyHash @ 0xd257f7e8
56 101,297,144
............\
  • [19] java.lang.Object[21] @ 0xd0746530
104 101,415,528
.............\
  • varTable org.jruby.RubyObject @ 0xd2570870
32 101,415,560
..............\
  • [34] java.lang.Object[62] @ 0xd2e7fc38
264 58,584
...............\
  • varTable org.jruby.RubyObject @ 0xd1f81950
32 58,616
................+
  •  java.lang.Thread @ 0xd093baa8 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1725ca0 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1753820 pipeline.main Thread
104 2,536
................+
  •  java.lang.Thread @ 0xd1754728 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1754790 [main] Busy Monitor, Thread
104 1,864
................+
  •  java.lang.Thread @ 0xd1760f28 [main] Thread
104 1,696
................+
  •  java.lang.Thread @ 0xd17617b0 [main]>worker0 Thread
104 2,520
................+
  •  java.lang.Thread @ 0xd1761818 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd17d0a20 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd17d0af0 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1823ac0 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1825a08 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1830c08 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1830c70 [main] Thread
104 1,864
................+
  •  java.lang.Thread @ 0xd1831f88 [main] Thread
104 1,696
................+
  •  java.lang.Thread @ 0xd18321f8 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1832468 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1832740 [main] Thread
104 1,528
................+
  •  java.lang.Thread @ 0xd1d6cf80 [main] Thread
104 1,696
................+
  •  java.lang.Thread @ 0xd1d6d050 [main] Thread
104 1,576
................+
  •  java.lang.Thread @ 0xd1d6d120 Ruby-0-Thread-24: /apps/svr/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.1-java/lib/logstash/pipeline.rb:444 Thread
104 944
................+
  • self org.jruby.runtime.Binding @ 0xd1c21388 »
48 96
................+
  • self org.jruby.runtime.Binding @ 0xd1e7c020 »
48 96
................+
  • self org.jruby.runtime.Binding @ 0xd1e82680 »
48 96
................+
  • self org.jruby.runtime.Binding @ 0xd1e93da0 »
48 96
................\
  • Total: 25 of 30 entries; 5 more
   

查看org.jruby.RubyObject引用的对象:

一次MAT分析logstash内存溢出_第13张图片

一次MAT分析logstash内存溢出_第14张图片


一次MAT分析logstash内存溢出_第15张图片

由上几张图可以看出:org.jruby.RubyObject中保存了大量的local变量比如方法的入参和方法内创建的变量),这些可能导致了内存溢出。



你可能感兴趣的:(一次MAT分析logstash内存溢出)