当前位置: 首页 > 后端技术 > Java

Java实训:内存泄漏排查与分析

时间:2023-04-02 00:03:58 Java

1.疑似内存泄漏进入APM监控系统查看实例内存状态。将时间线延长至一天。可以看到内存有缓慢上升的趋势,初步怀疑是内存泄漏。2、HeapDump获取机器ip,联系运维人员dump机器上的heap,dump命令:/xxx/jdk1.8.0_212/bin/jmap-dump:live,format=b,file=/xxx/xxx.hprofprocessID下载heapdump文件Xxx.hprof到本地。3、下载HeapDump分析工具常用的分析工具有MAT和JProfile。本文以MAT工具为例进行分析。工具下载链接如下:https://www.eclipse.org/mat/d...注:如果本地安装了JDK11+,直接下载最新的java培训即可;如果你本地安装了JDK8,建议下载1.9.2版本。4.将Dump文件导入MAT工具MAT是eclipse的插件,免安装,双击打开即可使用。打开下载的dump文件5.分析dump文件打开内存泄漏分析报告,可以看到SessionFactoryImpl对象使用了149M内存,占总内存的25%,这肯定是不正常的。SessionFactoryImpl类与数据库有关。服务代码使用JPA作为持久层框架。它应该与JPA有关。继续分析吧。我们打开内存树往下挖,可以看到对象QueryPlanCache占用了很多内存。QueryPlanCache表面上的意思是:查询计划缓存。具体意思用google查一下。简单来说,Hibernate会缓存sql语句,减少重复编译,方便直接命中,提高效率。在使用sqlin的时候,如果in后面的参数不同,hibernate会把它缓存为不同的sql,从而缓存大量的sql。缓存的大小是多少?查了官方文档,如果没有配置的话,这个缓存的默认最大值是2048。StackOverflow上也有用户反馈这个问题:https://stackoverflow.com/que...7.分析结论有一个drawio服务中存在大量sqlin语句,in后面的参数不一样,导致Hibernate缓存了大量的sql语句,占用大量堆内存。8、解决方案(1)增加配置参数限制缓存大小参数说明:https://docs.jboss.org/hibern...(2)提高sql的缓存效率参数说明:https://docs。jboss.org/hibern...来自JavaProgramming的文章