java OOM问题分析排查

java服务OOM最常见的原因:

  1. 内存分配过小,而正常业务需要使用更大的内存;
  2. 某一个对象被频繁申请,确没有释放,内存不断泄露,导致内存耗尽;
  3. 某一个资源被不断申请,系统资源耗尽,如:不断创建线程,不断发起网路连接。

排查过程:

1、jmap -heap pid 查看堆内存分配:

jmap -heap -pid 确认内存本身是否分配过小,可以看到 新生代、老年代的参数配置。

C:\Users\Lenovo>jmap -heap 19676
Attaching to process ID 19676, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4257218560 (4060.0MB)
   NewSize                  = 88604672 (84.5MB)
   MaxNewSize               = 1418723328 (1353.0MB)
   OldSize                  = 177733632 (169.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 127926272 (122.0MB)
   used     = 57173416 (54.524818420410156MB)
   free     = 70752856 (67.47518157958984MB)
   44.69247411509029% used
From Space:
   capacity = 16252928 (15.5MB)
   used     = 8648808 (8.248146057128906MB)
   free     = 7604120 (7.251853942871094MB)
   53.21384552986391% used
To Space:
   capacity = 15728640 (15.0MB)
   used     = 0 (0.0MB)
   free     = 15728640 (15.0MB)
   0.0% used
PS Old Generation
   capacity = 143130624 (136.5MB)
   used     = 18320840 (17.47211456298828MB)
   free     = 124809784 (119.02788543701172MB)
   12.800083928929144% used

18607 interned Strings occupying 2382728 bytes.

 

2、查看该pid下线程对应的系统占用情况:

top -Hp pid 

 

3、找到最耗内存的对象

jmap -histo:live pid | more

输入命令后,会议表格的形式显示存活的对象信息,并按照所占内存大小排序:

字段分别代表:实例树、所占内存大小、类名

C:\Users\Lenovo>jmap -histo:live 19676|more

 num     #instances         #bytes  class name
----------------------------------------------
   1:         51966        8639472  [C
   2:         50741        1217784  java.lang.String
   3:         10865         956120  java.lang.reflect.Method
   4:          8243         914968  java.lang.Class
   5:         20954         670528  java.util.concurrent.ConcurrentHashMap$Node
   6:         10233         495936  [Ljava.lang.Object;
   7:         13700         438400  java.lang.ref.WeakReference
   8:          9719         388760  java.util.LinkedHashMap$Entry
   9:          4623         350712  [Ljava.util.HashMap$Node;
  10:         10230         327360  java.util.HashMap$Node
  11:          6991         279640  java.lang.ref.SoftReference
  12:          4959         277704  java.util.LinkedHashMap
  13:          1767         257336  [B
  14:          3674         205744  java.beans.MethodDescriptor
  15:         12034         192544  java.lang.Object
  16:          7684         184416  java.beans.MethodRef
  17:           111         183088  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  18:          3220         170120  [I
  19:          7499         168048  [Ljava.lang.Class;
  20:          6986         167664  java.util.ArrayList
  21:          5245         154944  [Ljava.lang.String;
  22:          3232         129280  org.springframework.util.ConcurrentReferenceHashMap$Segment
  23:          3633         116256  java.util.concurrent.locks.ReentrantLock$NonfairSync
  24:          3502         112064  java.lang.ref.ReferenceQueue
  25:           993          95328  org.springframework.beans.GenericTypeAwarePropertyDescriptor
  26:          3232          88440  [Lorg.springframework.util.ConcurrentReferenceHashMap$Reference;
  27:          3474          83376  org.springframework.core.MethodClassKey
  28:          3232          77568  org.springframework.util.ConcurrentReferenceHashMap$ReferenceManager
  29:          1430          68640  java.util.HashMap
  30:           947          68184  java.beans.PropertyDescriptor
  31:          2578          61872  java.util.LinkedList$Node
  32:           743          59440  java.lang.reflect.Constructor
  33:          3504          56064  java.lang.ref.ReferenceQueue$Lock
  34:           981          54936  java.lang.invoke.MemberName
  35:          1358          54320  java.util.TreeMap$Entry
  36:          1682          53824  java.util.LinkedList
  37:           698          50256  org.springframework.core.annotation.AnnotationAttributes
-- More  --

4、测试堆栈溢出:

jstat -gcutil pid 时间间隔毫秒

C:\Users\Lenovo>jstat -gcutil 19676 1000
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  0.00   0.00   4.90  10.01  94.82  92.16     11    0.073     4    0.182    0.255
  • S0(即:from):幸存1区当前使用比例;
  • S1(即:to):幸存2区当前使用比例;
  • Eden:伊甸园区使用比例;
  • Old:老年代使用比例;
  • MetaSpace:元数据区使用比例;
  • CCS:压缩使用比例;
  • YGC:年轻代垃圾回收次数;
  • YGCT:年轻代垃圾回收时间;
  • FGC:老年代垃圾回收次数;
  • FGCT:老年代垃圾回收消耗时间;
  • GCT:垃圾回收消耗总时间 .

 5、生成对应的pid的dump文件:

jmap -dump:format=b,file=heap.hprof pid

C:\Users\Lenovo>jmap -dump:format=b,file=heap.hprof 19676
Dumping heap to C:\Users\Lenovo\heap.hprof ...
Heap dump file created

注意:pid对应的项目是哪个用户启动的,就用哪个用户权限生成文件,否则会报错:Unable to open socket file:target process not responding or HotSpot VM not loaded.

6、heap.hprof 文件导出用MAT分析,可以用sz导出

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值