Druid监控sql导致的内存溢出
问题
druid监控sql在网页端显示,我的服务插入sql比较大,druid把执行过的sql保存在DruidDataSource类的成员变量JdbcDataSourceStat dataSourceStat;
JdbcDataSourceStat类中的LinkedHashMap<String, JdbcSqlStat> sqlStatMap中; sqlStatMap中的sql越来越多导致老年区的内存越来越多且回收不掉。
解决办法
关闭druid的监控,该监控会耗尽内存
spring.datasource.druid.stat-view-servlet.enabled=false
spring.datasource.druid.web-stat-filter.enabled=false # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
# filters: stat,wall,slf4j 原来的配置filters: slf4j #现在的配置,除去stat,wall
发现问题
2025-04-27T02:04:58.124+0800: 118542.443: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747632K->1747631K(1747968K)] 2136752K->2136751K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4695953 secs] [Times: user=1.64 sys=0.00, real=0.47 secs]
2025-04-27T02:04:58.593+0800: 118542.914: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747631K->1747631K(1747968K)] 2136751K->2136751K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4865868 secs] [Times: user=1.48 sys=0.02, real=0.49 secs]
2025-04-27T02:04:59.082+0800: 118543.402: [Full GC (Ergonomics) [PSYoungGen: 389119K->389119K(427520K)] [ParOldGen: 1747635K->1747629K(1747968K)] 2136755K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4742007 secs] [Times: user=1.52 sys=0.00, real=0.47 secs]
2025-04-27T02:04:59.557+0800: 118543.877: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4986030 secs] [Times: user=1.55 sys=0.02, real=0.50 secs]
2025-04-27T02:05:00.057+0800: 118544.377: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4815433 secs] [Times: user=1.63 sys=0.00, real=0.48 secs]
2025-04-27T02:05:00.539+0800: 118544.859: [Full GC (Ergonomics) [PSYoungGen: 389119K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4686810 secs] [Times: user=1.53 sys=0.00, real=0.47 secs]
这个GC日志显示Full GC没有释放任何堆内存空间,还一直在执行Full GC,导致cpu占用在80%,可能是存在内存泄漏问题导致对象无法被回收。