JVM学习-freemarker导致内存泄露问题分析排查(十三)

1. 说明

测试环境出现非常慢,测试说执行过工单word导出就出现这种问题

2. 排查步骤

1.查看机器cpu和内存 正常

2.排查gc回收 发现一只在触发full gc

jstat -gc 10755 

3.dump堆信息进行分析

jmap -dump:format=b,file=/Users/liqiang/Desktop/logs/heap.hprof  pid

4.先通过Vm查看

根据大对象名字看不出什么问题
在这里插入图片描述
5.使用MAT 导入dump文件进行分析
在这里插入图片描述
6.前面3个都是相同的堆栈看业务代码是导出 高度嫌疑
在这里插入图片描述
7.点击Details当前执行线程运行引用的对象信息

可以发现freemarker.core.SimpleCharStream 为大对象类
在这里插入图片描述
9.一般查看内存泄露都是看引用refrences

可以看出源头是template 的parser引用tokenSource …
在这里插入图片描述
10.MAT我感觉不直观可以使用VM
在这里插入图片描述
在这里插入图片描述
11.跟源码发现parse在初始化后就置空了销毁了,理论上垃圾回收期会回收
在这里插入图片描述
12.看线程堆栈确实是在template 构造函数触发的大对象占用得不到释放
在这里插入图片描述
13.最后根据业务代码定位到 调用了2次fremakker渲染
在这里插入图片描述
14.最后怀疑是不是第一次已经填充了数据,整个结果非常大 因为含有图片。图片针对word导出是填充的图片的base64的数据

第二次根据第二次的结果再进行渲染因为太大 导致异常在template卡死

优化后发布可以正常导出了
在这里插入图片描述

3. 一些误区

这个场景其实原有对象内存占用非常小,但是原有对象引用了字符串对象导致长期得不到释放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值