Java数据库连接池超时的原因竟然是OutOfMemory

背景

线上Java进程频繁数据库链接超时

排查

GC次数和时间

/usr/lib/jvm/jdk_9.0.4/bin/jstat -gc 42925
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   352256.0  0.0   352256.0 6684672.0 1351680.0 24420352.0 21140752.9 117976.0 110809.0 12288.0 10910.8  57183 4349.786   7    435.969 4785.755

其对应的指标含义如下:

S0C 年轻代中第一个survivor的容量 (字节) -- Survivor Capacity
S1C 年轻代中第二个survivor的容量
S0U 年轻代中第一个survivor目前已使用空间 -- Survivor Used
S1U 年轻代中第二个survivor目前已使用空间
EC 年轻代中Eden的容量
EU 年轻代中Eden目前已使用空间
OC Old代的容量
OU Old代目前已使用空间
MC 方法区大小
MU 方法区目前已使用空间
CCSC 压缩类空间大小
CCSU 压缩类空间已使用大小
YGC 从应用程序启动到采样时young gc 次数
YGCT 从应用程序启动到采样时young gc 用时(s)
FGC 从应用程序启动到采样时full gc 次数
FGCT 从应用程序启动到采样时full gc 用时
GCT 从应用程序启动到采样时young+fulll gc总用时

查看日志

zcat java-2025-01-14-*|grep 'OutOfMemo'
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
Caused by: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

Dump堆内存,jcmd会引起一次fullGC,导致Stop The World

/usr/lib/jvm/jdk_9.0.4/bin/jcmd 42925 GC.heap_dump heapdump.hprof

dump出来的文件巨大,只能在服务器上MAT分析;

下载Linux版本的MAT,下载地址

下载时候需要注意版本,最新版本对jdk版本有较高要求,对于jdk8需要下载以前的版本,1.9.0左右的

开始MAT分析

修改MemoryAnalyzer.ini文件调大-Xmx参数,否则分析时候会OOM
修改MemoryAnalyzer.ini文件在-vmargs之前增加-vm指定JDK路径:-vm /usr/lib/jvm/jdk_9.0.4/bin/
./ParseHeapDump.sh heapdump.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

指定生成3种分析报告:

  • 内存泄漏可疑点
  • 概览
  • 内存占用TOP对象

如果遇到Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable这类异常,可能是由于设置了DISPLAY环境变量的原因,需要unset掉,然后重新执行分析

首次分析很慢很慢,但是分析完成后会生成一系列的.index索引文件,再次分析就会很快了;

分析完成后,会生成三个zip文件;解压后可以通过浏览器直接查看分析结果


image.png

题外话

关于堆外内存的一些排查思路

查看进程分配分内存块

第一列是内存块的开始地址,后面是大小

pmap -x 42925 | sort -n -r -k 3|more
total kB         52303476 34464456 34453308
0000000080000000 31469568 31469568 31469568 rw---   [ anon ]
00007f6b1cc00000 1105920 1105920 1105920 rw---   [ anon ]
00007f6c44000000   65536   65536   65536 rw---   [ anon ]
00007f6b70000000   65536   65536   65536 rw---   [ anon ]
00007f67b0000000   65536   65536   65536 rw---   [ anon ]
00007f67a8000000   64396   64396   64396 rw---   [ anon ]
00007f6b681ff000   63492   61508   61508 rw---   [ anon ]
00007f6af8000000   48600   48600   48600 rw---   [ anon ]
00007f6c2a310000   45568   45528   45528 rwx--   [ anon ]
00007f6b6c000000   44988   44988   44988 rw---   [ anon ]
00007f6b78000000   33232   33232   33232 rw---   [ anon ]
00007f6acc000000   31252   31252   31252 rw---   [ anon ]
00007f6ae4000000   33328   30720   30720 rw---   [ anon ]
00007f6c31729000   30656   30632   30632 rwx--   [ anon ]
00007f6ae0000000   41732   29164   29164 rw---   [ anon ]
00007f6b74000000   26832   26832   26832 rw---   [ anon ]
00007f6ac8000000   38664   26624   26624 rw---   [ anon ]
00007f6ac0000000   50412   26624   26624 rw---   [ anon ]
00007f6ad4000000   59636   25612   25612 rw---   [ anon ]
00007f6aec000000   51172   25132   25132 rw---   [ anon ]
00007f6b80000000   22988   22988   22988 rw---   [ anon ]
00007f6c28028000   22616   22616   22616 rw---   [ anon ]
00007f6a8c000000   22112   20988   20988 rw---   [ anon ]
00007f6ad0000000   51244   20676   20676 rw---   [ anon ]
00007f68a8000000   38888   20632   20632 rw---   [ anon ]
00007f6b7c000000   20088   20088   20088 rw---   [ anon ]
00007f6b88000000   18940   18940   18940 rw---   [ anon ]
00007f6adc000000   56580   18776   18776 rw---   [ anon ]
00007f6c08000000   18624   18624   18624 rw---   [ anon ]
00007f6bd8000000   17756   17756   17756 rw---   [ anon ]
00007f6ad8000000   25832   17316   17316 rw---   [ anon ]
00007f68f6f02000   17400   16476   16476 rw---   [ anon ]
00007f6b84000000   16184   16184   16184 rw---   [ anon ]
00007f6b90000000   16120   16120   16120 rw---   [ anon ]
00007f6b8c000000   15816   15816   15816 rw---   [ anon ]
00007f6bfc000000   15224   15224   15224 rw---   [ anon ]
00007f6bcc000000   14512   14512   14512 rw---   [ anon ]
00007f6bec000000   14424   14424   14424 rw---   [ anon ]
00007f684c000000   14172   14156   14156 rw---   [ anon ]
00007f6bd0000000   14104   14104   14104 rw---   [ anon ]
00007f6c24000000   14068   14068   14068 rw---   [ anon ]
00007f6b98000000   13728   13728   13728 rw---   [ anon ]
00007f6c0c000000   13644   13644   13644 rw---   [ anon ]
00007f6c20000000   13632   13632   13632 rw---   [ anon ]
00007f6be8000000   13256   13256   13256 rw---   [ anon ]
00007f6bf4000000   13164   13164   13164 rw---   [ anon ]

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容