Java 内存溢出调查

1.查看对象直方图(第一种方式)

jcmd [pid] GC.class_histogram > class_histogram.txt 

通过【class_histogram】可以看到排名第一的【org.pentaho.di.core.metrics.MetricsSnapshot】创建了

43290906个实例,是内存消耗最大的类,这个类是kettle中用会收集指标,并记录到ConcurrentLinkedQueue中,由此可以看出,由于日志量巨大,缓冲区可能已满,导致:

(1)快照对象MetricsSnapshot,和关联对象DateNode无法被回收。

  (2) 队列持续增长,最终沾满整个堆内存。

12411:

 num     #instances         #bytes  class name
----------------------------------------------
   1:      43290906     1731636240  org.pentaho.di.core.metrics.MetricsSnapshot
   2:      43300876     1039221024  java.util.Date
   3:      43289667     1038952008  java.util.concurrent.ConcurrentLinkedQueue$Node
   4:        425886       40336320  [C
   5:        362099       11587168  java.util.concurrent.ConcurrentHashMap$Node
   6:        425175       10204200  java.lang.String
   7:        137616        6084656  [B
   8:         56618        4982384  java.lang.reflect.Method
   9:         21459        4893496  [I
  10:         23127        4002928  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  11:         46059        3563320  [Ljava.lang.Object;
  12:         23345        2602448  java.lang.Class
  13:         44746        2147808  org.aspectj.weaver.reflect.ShadowMatchImpl
  14:         79596        1910304  java.util.concurrent.ConcurrentLinkedQueue
  15:         40916        1636640  java.util.LinkedHashMap$Entry
  16:         49949        1598368  java.util.HashMap$Node
  17:         17632        1525840  [Ljava.util.HashMap$Node;

                                  ......

2.分析堆转储(第二种方式)

执行以下命令,生成核心堆dump文件

jmap -dump:live,format=b,file=heapdump_[pid].hprof [pid]

如果内存较大建议使用以下命令分块生成

jmap -dump:live,format=b,file=heap.hprof,chunksize=1g [pid]

2.1将生成的dump文件(也就是xxx.hprof)导入到VisualVm中,也可以看到比对象直方图更多的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值