简介
在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有触发OOM,但好在之前的复盘中总结了dump脚本,会在堆占用高时自动执行jstack与jmap,使得我们成功保留了问题现场。
查看堆占用分布
发现有heapdump文件后,我立马拷贝到本机,并使用MAT分析,如下:
很显然,好像是什么接口分配了非常大的String对象,一个String对象约200MB,那它是哪分配的呢?
查找大对象分配线程
这个分配行为肯定是某个线程做的,而线程是最常见的GC Root,因此只要查找对象的GC Root即可,如下:
找到了大对象对应的分配线程是http-nio-8088-exec-6,如下:
查看线程栈
如何查看这个线程在干什么呢?在MAT中摸索了一会,没找到相关内容,回想起我们的dump脚本中记录了jstack,打开看看,如下: