# DEE任务编写不当导致内存溢出

# 问题现象

用户突然出现无法登录、系统大面积卡慢问题,通过重启问题消除。但使用一小段时间又出现无法登录、大面积卡慢等问题。

登录一直处于加载中,页面空白是表现之一:

1739410150708.png

手机端无法访问OA服务器是问题表现之一:

1739410097231.png

# 分析过程

通过登录系统管理员,查看系统监控,发现JVM中的堆使用极高:历史峰值到了99%,当前使用95%。通过堆的使用率就能明确:当前系统内存占用极高,很可能存在不合理的内存申请情况。

正常情况下堆使用率在50%以下是正常的,当堆使用率超过80%之后,JVM判断内存即将不足,可能会去主动GC,大内存GC会让系统完全卡死几分钟不等,这个是系统卡顿的根源。

1739410257992.png

基于以上现象,我们着重分析内存分布,找出谁占用内存最大即可找到元凶。

我们可以先访问OA服务器程序目录ApacheJetspeed\bin,检查目录下是否生成了后缀为.hprof的文件,并且确保文件的更新日期与服务器卡顿时对得上,如果有此问题就取文件放MAT中分析。

如果bin目录没有.hprof文件,则根据情况访问jdk/bin目录手动生成堆快照jmap -dump:format=b,file=[堆内存dump文件名].bin [协同服务java进程pid]

生成的快照放入MemoryAnalyzer(MAT)工具中跑结果。

通过生成结果可以发现内存耗费点是DEE的定时任务,定时任务过多,每个定时任务都在使用大量的对象导致整体占用过高。

1739414335276.png

1739414656907.png

1739414700685.png

解决方案:

检查DEE定时任务配置,减少任务频次,针对内存快照发现的问题堆栈进行DEE任务代码优化,减少不必要的内存消耗。

# 总结

但凡发现JVM内存占用超过80%,那内存一定是存问题的,此时通用分析方法就是使用MAT工具分析找出问题根源并修复。

编撰人:het