两例相似的JVM OOM排查工作

969 阅读1分钟

案例一:在集成ES依赖(version6.8.8),选型为ES-restHighLevelClient时,进行定时ES读取操作时,在部署到测试环境一晚上后,程序异常终止

案例二:在集成Kafka,定时创建Producer发送消息时,在部署到测试环境一晚上后,程序异常终止

遇到OOM异常退出问题,首先在本地调试,由于是定时任务出现的异常,所以直接把定时任务调至1s执行一次,观察jvisiulvm的线程情况

对于案例一:在实时线程中发现有大量的IO-dispatcher线程处于Runable状态却未进行销毁,即定位问题,创建ES-restHighLevelClient时存在创建了未关闭的情况,经检查定位到了错误,再次使用jvisualvm进行线程监控,这次已经是出现一个,销毁一个,问题解决

有了案例一的经验:出现案例二时还是同样的解决思路,具体情况: 定时任务中出现OOM情况,且线程编号较大,初步猜测是Kafka Producer线程未关闭导致

查看实时线程 果然又是客户端销毁时机的问题,定位后问题解决,再次看实时线程恢复正常

经过以上两例简单的OOM异常排查,可以推广至一切需要关闭的API,即把握一个思路,有开就有关,且开关要对应,才能关闭所有.