一、排查过程
1:查看机器监控,初步判断可能有耗CPU的线程
bf04410e-9f05-4958-83e0-a2ead10a4aaa
2:导出jstack,发现有大量的RUNNABLE线程,都在java-NIO,之前看过下面http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933这篇文章,感觉是这个BUG,由于对ES不熟悉,网上看了一些ES资料,寻求从网络寻找类似案例,没有找到结果。
acee5685-d3d6-4d18-8f91-6e2b4208d77f
3:第二天,查看NETTY代码发现,netty已经解决了NIO-BUG,可以排除NIO-BUG了。
2a2ab8d7-faab-49ff-a37c-36e3021568fe
4:导出jstat信息,发现JVM老年代占用过高(达到97%),Full-GC频率超高,FULL-GC总共占用了36小时。初步定位是频繁FULL-GC导致CPU负载过高。
6a7fb44a-b86a-44a3-9355-5888aae1db3f
5:使用jmap –histo导出堆概要信息,发现有个超大的HashMap。
2dcacbd2-fd8d-431c-93c1-038e98f02f1c
6:使用jmap –dump导出堆。
74ae2f08-3c07-43f3-99c2-e4cd27946419
6523c119-ba92-4fc0-84ab-e4417672b50d
得出hashMap中的KEY是运单号
二、总结
1:使用缓存时要做容量估算,并考虑数据增长率
2:缓存要有过期时间。