Java内存溢出分析

1 查看内存中对象数量及大小

#查看所有对象,包括活跃以及非活跃的
jmap ‐histo <pid>|more 

#只查看活跃对象
jmap ‐histo:live <pid>|more

     num     #instances         #bytes  class name
    ----------------------------------------------
       1:         37764       26186680  [B
       2:        122647       19529728  [C
       3:         93460       15493288  <constMethodKlass>
       4:         93460       12720848  <methodKlass>
       5:          8114       10767672  <constantPoolKlass>
       6:          9673       10369456  oracle.jdbc.driver.T4CPreparedStatement
       7:        158710        9349776  <symbolKlass>
       8:          8114        6424120  <instanceKlassKlass>
       9:          6639        5976024  <constantPoolCacheKlass>
      10:         98421        5213120  [I
      11:        115403        3692896  java.lang.String
      12:          3434        2284976  <methodDataKlass>
      13:         33199        1411136  [S
      14:         33341        1333640  java.util.LinkedHashMap$Entry
      15:         13211        1273696  [Ljava.util.HashMap$Entry;
      16:          9748        1091776  java.util.GregorianCalendar
      17:         10812         951456  java.lang.reflect.Method
      18:          9752         936192  sun.util.calendar.Gregorian$Date
      19:         23266         930640  java.lang.ref.Finalizer
      20:          8852         920608  java.lang.Class
      21:         12697         673736  [[I
      22:         20445         654240  java.util.HashMap$Entry
      23:          8945         572480  java.net.URL
      24:          9725         544600  sun.util.calendar.ZoneInfo
      25:         10044         473336  [Ljava.lang.Object;
      26:         15150         452088  [Ljava.lang.String;
      27:          3644         437280  java.net.SocksSocketImpl
      28:         10163         421464  [Z
      29:           709         414056  <objArrayKlassKlass>
      30:          7276         407456  java.util.LinkedHashMap
      31:          9673         386920  oracle.jdbc.driver.OraclePreparedStatementWrapper
      32:          9673         386920  org.logicalcobwebs.proxool.ProxyStatement
      33:         11027         352864  java.util.concurrent.ConcurrentHashMap$HashEntry
      34:         12078         338208  [[I
      35:          6698         337816  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
   
    #对象说明
    B byte
    C char
    D double
    F float
    I int
    J long
    Z boolean
    [ 数组,如[I表示int[]
    [L+类名 其他对象

2、将内存使用情况dump到文件中

  有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析。

    #用法:
    jmap ‐dump:format=b,file=dumpFileName <pid>
    #示例
    jmap ‐dump:format=b,file=/tmp/dump.dat 6219

3、通过jhat对dump文件进行分析

    #用法:
    jhat ‐port <port> <file>
    #示例:
    [root@node01 tmp]# jhat ‐port 9999 /tmp/dump.dat
    Reading from /tmp/dump.dat...
    Dump file created Mon Sep 10 01:04:21 CST 2018
    Snapshot read, resolving...
    Resolving 204094 objects...
    Chasing references, expect 40
    dots........................................
    Eliminating duplicate references........................................
    Snapshot resolved.
    Started HTTP server on port 9999
    Server is ready.

打开浏览器进行访问:http://192.168.0.112:9999/
Java内存溢出分析_第1张图片
在最后面有OQL查询功能。
Java内存溢出分析_第2张图片
Java内存溢出分析_第3张图片

4、通过MAT工具对dump文件进行分析

  MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

你可能感兴趣的:(JAVA)