记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/