# DEE任务编写不当导致内存溢出
# 问题现象
用户突然出现无法登录、系统大面积卡慢问题,通过重启问题消除。但使用一小段时间又出现无法登录、大面积卡慢等问题。
登录一直处于加载中,页面空白是表现之一:
手机端无法访问OA服务器是问题表现之一:
# 分析过程
通过登录系统管理员,查看系统监控,发现JVM中的堆使用极高:历史峰值到了99%,当前使用95%。通过堆的使用率就能明确:当前系统内存占用极高,很可能存在不合理的内存申请情况。
正常情况下堆使用率在50%以下是正常的,当堆使用率超过80%之后,JVM判断内存即将不足,可能会去主动GC,大内存GC会让系统完全卡死几分钟不等,这个是系统卡顿的根源。
基于以上现象,我们着重分析内存分布,找出谁占用内存最大即可找到元凶。
我们可以先访问OA服务器程序目录ApacheJetspeed\bin,检查目录下是否生成了后缀为.hprof
的文件,并且确保文件的更新日期与服务器卡顿时对得上,如果有此问题就取文件放MAT中分析。
如果bin目录没有.hprof
文件,则根据情况访问jdk/bin目录手动生成堆快照jmap -dump:format=b,file=[堆内存dump文件名].bin [协同服务java进程pid]
。
生成的快照放入MemoryAnalyzer(MAT)工具中跑结果。
通过生成结果可以发现内存耗费点是DEE的定时任务,定时任务过多,每个定时任务都在使用大量的对象导致整体占用过高。
解决方案:
检查DEE定时任务配置,减少任务频次,针对内存快照发现的问题堆栈进行DEE任务代码优化,减少不必要的内存消耗。
# 总结
但凡发现JVM内存占用超过80%,那内存一定是存问题的,此时通用分析方法就是使用MAT工具分析找出问题根源并修复。
编撰人:het
