记1次数据堆栈溢出

 

从线上服务器已获取到堆栈文件,java_pid28439.hprof。

一开始使用 [fastThread](https://heaphero.io/ft-index.jsp)在线分析工具,或者 [GCeasy](https://gceasy.io/index.jsp)。

但由于文件大小 > 1G,无法使用。

于是下载了JProfiler,试用10天。

 

 

 

发现 byte[]占用3200MB,内存占用共 4370MB。而服务器最大内存是4G,导致内存溢出。

查看最大对象:

 

 

分析最大对象引用:

 

 

使用选定对象:

 

 

 传入引用:

 

 

 

 

 右键显示节点详细信息,查看堆栈:

 

 

 

 

 

分析调用链,定位业务代码。 最后发现是一个Dubbo接口,根据id查询实体对象,id为空,导致根据 id in ids的条件不生效,查询的是全表数据,

表的数据量在150w左右,一次加载进内存,导致内存溢出。

解决:id为空,在服务层就直接返回,不请求到Mapper层。

另[JDBC 基本流程源码分析](https://segmentfault.com/a/1190000040580622)

 

Dubbo配置项参考手册: https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/properties/

 

posted @ 2023-01-06 15:51  parkdifferent  阅读(43)  评论(0编辑  收藏  举报