记录一次分析堆栈溢出的分析过程
遇到问题:生产环境已经两年正常运行,最近其中一个基础服务一直处于高的cup占用,且一直垃圾回收中。已排除环境问题
分析过程:
1获取了dump文件,在IBMAnalyizer中运行分析:java -Mmx1024m -jar ha457.jar ,选中dump文件
2查找到堆栈溢出的部分,如图:
通过Analysis -> treeview
3、可以看出这两个占用了过高的内存,分析是此位置出现了问题。
4 、sessionFactoryImpl和statefulpersistencecontext两个类出现问题
5、经查阅:因为Hibernate的Session是带有一级缓存的,每个经由Session查出来的对象会填充至一级缓存,以避免多次的数据库仿问。当这几个 quartz任务的业务数据较多的时候,就会有很多对象被填入一级缓存这样一来持久化上下文中保存的对象越来越多。最终导致堆栈溢出
6、因为此项目使用了jpa,访问量也很大,很可能引起上述session的问题,建议jpa修改成mybatis写法。(能不用jpa就不要使用,坑还是很多的)