内存溢出的坑

关于数据处理

互联网圈子有个怪现象,白天用户高峰,为了将可能的影响降到最低,一些数据处理的工作,一般就放在晚上,所谓的晚上也就十一二点以后吧。

可是程序员哥哥也是需要休息的,当程序数据处理出问题了,就没人处理了,这种要么等夜神运维及时发现,层层打电话找人解决,要么服务直接宕机,造成严重故障或不必要的扩大影响。

怎么避免这种问题呢,?

  • 加班到凌晨,甚至睡在公司等数据处理完成再回家,fuck。。
  • 保佑emoji people:pray数据处理一切正常。

我的观点:

  • 在流量低峰处理数据的观点是okay的,无可厚非,但是不一定非要等到夜深人静的时候
  • 处理数据的任务不能影响正常的功能(这个必须得保证,不然就忍受熬夜处理问题吧)
  • 既然处理数据的任务不影响正常的功能,就可以在非用户高峰时间段的工作时间处理任务。这样的好处是(1)有问题能及时处理(2)不用熬夜,fuck

内存溢出

现象

处理数据的任务,运行一段时间后,内存占用逐渐增加,一直居高不下,到达服务器极限,如果不及时处理,服务随时宕机。

处理

  • 停止正在运行的数据处理任务,线上服务器重启,释放内存。
  • 开发环境,运行数据处理任务,jvisualvm观察gc情况,确实占用内存不断彪高,
  • 堆dump,查看堆内容,发现50%+是存数据的Map对象
  • 问题定位,内存里太多承载数据的对象没有及时被处理,导致内存耗尽。

解决方法

  • 处理数据的任务需要异步执行,使用线程池
  • 线程池任务处理时再加载数据(这点很重要)
# java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×