为什么Timer定时任务运行时占用内存一直增加

冰a冰 2021-05-27 10:31:18

代码如图,单线程的一个简单的监控数据入库的程序。Timer 的 run() 方法中调用了三个方法,前两个方法返回统计结果,传入第三个方法发送邮件。
启动时占用内存50M左右,然后一直缓慢增长,虽然增长很慢,但早晚会溢出,如果是运行在服务器上后果不敢想象。
求解答~
...全文
1549 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰a冰 2021-06-04
  • 打赏
  • 举报
回复

问题已经解决了,直接在运行程序是设置了内存上限60M,目前已稳定运行一周,没有发现问题。

因为第一次用jprofile,说实话没有用明白,暂时用这种方式处理的。待研究后监控下程序到底哪个位置的存储出现了问题再来解决

冰a冰 2021-05-27
  • 打赏
  • 举报
回复
引用 3 楼 七海我老婆 的回复:
用jprofile看看堆吧,看看哪些对象没被gc
好的,我监控一下,感谢
冰a冰 2021-05-27
  • 打赏
  • 举报
回复
引用 1 楼 得一以生 的回复:
代码没贴全,通过描述分析,可能是某个集合对象里的数据越来越多,没有清理机制,内存缓慢增长的话大概率是这种情况 针对代码内的公共list,set,map等,如果数据是不停的往里添加,需要有定时的清理机制或者备份机制,比如说超过多大,把数据全部刷到数据库或者redis或者文件中,然后清掉原来的集合
昨天用Timer 的时候用法错了,只传入了首次运行时间,误以为自动识别为每天的这个时间点,没有传入频率,第二天一看内存达到了400m。 刚才补充了频率参数,本地测试发现问题被解决了,峰值到达60m左右后会开始下降。现在放到服务器上再看一段时间。 还挺奇怪的,只传入首次启动时间的话不是相当于运行一次就结束吗,为什么程序没有退出呢。
冰a冰 2021-05-27
  • 打赏
  • 举报
回复
引用 1 楼 得一以生 的回复:
代码没贴全,通过描述分析,可能是某个集合对象里的数据越来越多,没有清理机制,内存缓慢增长的话大概率是这种情况 针对代码内的公共list,set,map等,如果数据是不停的往里添加,需要有定时的清理机制或者备份机制,比如说超过多大,把数据全部刷到数据库或者redis或者文件中,然后清掉原来的集合
感谢回答,公共集合是存的某个目录下的子目录名称,数量很少,而且每天运行一次,不运行的话是不会修改的。
菜鸟①个 2021-05-27
  • 打赏
  • 举报
回复
用jprofile看看堆吧,看看哪些对象没被gc
菜鸟①个 2021-05-27
  • 打赏
  • 举报
回复
你这没人能帮你看
得一以生 2021-05-27
  • 打赏
  • 举报
回复
代码没贴全,通过描述分析,可能是某个集合对象里的数据越来越多,没有清理机制,内存缓慢增长的话大概率是这种情况 针对代码内的公共list,set,map等,如果数据是不停的往里添加,需要有定时的清理机制或者备份机制,比如说超过多大,把数据全部刷到数据库或者redis或者文件中,然后清掉原来的集合

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧