公司的一组tomcat集群最近隔段时间出现OOM故障的问题,间隔时间以及发生故障的tomcat也是随机的,一时定位不到问题
发生OOM时 ,使用
jmap -dump:file=文件名.dump [pid]
一直无法dump出堆内存,于是给所有tomcat启动脚本配置参数,发生OOM时导出堆内存快照。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=目录.hprof
最后使用mat分析内存快照。
发现大量的hibernate实体类对象,占用1.3G的堆内存空间。
基本可以定位是查询出了问题。
排查代码后发现,原来开发人员在接口上没有做校验,虽然对端系统的特性以及接口文档规范用户账号是必须携带,
但可能由于异常的原因导致没有任何查询参数携带,导致查询数据库全部数据。。
接口加上参数校验后恢复正常 。