线上jvm OOM(原因:对象实例过多)

因为报错错就是堆内OOM,而不是机器OOM,所以就直接分析jvm堆内存了

jmap dump下来分析JVM内存,发现有一个对象实例很多,很不正常(虽然程序有new该对象,因为这是个操作记录,依据系统的查询qps基本能判断产生的数量,明显对不上), 且该对象包含大json,因为是偶发,所以很诡异。
将近30w的QueryRecord对象,该对象是比较大的
线上jvm OOM(原因:对象实例过多)_第1张图片
最后排查原因

  • 定时任务拉取操作记录对象,拉取设置的时间范围过大,导致拉取实例过多
  • 为什么时间范围过大 =》
    • 使用了一个当前时间和上一次定时任务运行时间
    • 用了本地变量去存储上一次时间,然后定时任务执行完去更新上一次时间变量

一个实例倒是没什么大问题,但多实例且任务是单实例运行定时任务就有问题了。

那么,要是1个实例今天跑了一次定时任务,然后一直都是其它实例在跑定时任务;那么突然定时任务选中个这个实例,那么时间范围就是【1天前,now】,本来比如说1小时定时任务都是【1小时前,now】的,这样无形之中犯错了。

时间:2020-05-26 晚

你可能感兴趣的:(项目经验总结,Java项目经验)