java应用线上一次故障诊断分析
今天項目發布,在預發布機器上居然出現應用啟動不到10分鐘 CPU使用率從不到1%飆升到95以上,load從不到1升到15以上,然后當然應用就不可用了,第一次還奇怪為什么10分鐘后就變成這樣,然后找不到原因,異常還一堆其他的異常,而且還有其他的需求一起發布,所以還懷疑其他需求的問題,然后就單獨發布自己的需求代碼,重新發布后大概10分鐘后又出現這個問題,想了想,一堆的超時,應用訪問也是超時,開始懷疑線程的問題,通過jstack dump java進程的線程棧信息,通過分析日志發現了 34個線程有16個線程的狀態處于同樣一處代碼上的runnable狀態,
?
"qtp1041301507-215" prio=10 tid=0x000000005aa2a800 nid=0x741d runnable [0x0000000044598000]java.lang.Thread.State: RUNNABLEat java.lang.Long.valueOf(Long.java:557)at com.alibaba.china.biz.viewcache.tree.NestTree.getNode(NestTree.java:188)at com.alibaba.china.biz.viewcache.ViewCacheTool.retrieveDisplayCategory(ViewCacheTool.java:802)at com.alibaba.apps.saleoffer.module.control.spuIndustry.SpuIndustryOfferResultMro.getIndustryMroAttributes(SpuIndustryOffer ResultMro.java:113)才訪問了幾次這個代碼對應的url,就出現該請求對應的處理線程一直在runnable狀態,而且應用的url顯示超時了。
?
好吧,再查下代碼
while (true) {DisplayCategory offerCategory = viewCacheTool.retrieveDisplayCategory(curCategoryId);if (offerCategory != null && offerCategory.getAttributes() != null && offerCategory.getAttributes().size() > 0) {for (int i = 0; i < offerCategory.getAttributes().size(); i++) {...} curCategoryId = offerCategory.getSuperCategoryId1();} ......}這段代碼再執行過程中由于?viewCacheTool.retrieveDisplayCategory的生產環境和測試環境的數據源不同導致在測試環境沒有出現問題,而線上處理過程由于curCategoryId = offerCategory.getSuperCategoryId1();在遞歸過程中
由于沒有進入if程序塊,導致死循環。
?
第一次遇到cpu和load飆升這么高,很有可能還真是死循環引起的,跟線程一直在執行有關。
轉載于:https://www.cnblogs.com/secbook/archive/2012/07/02/2655159.html
總結
以上是生活随笔為你收集整理的java应用线上一次故障诊断分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 图算法(3)
- 下一篇: 一夜暴富之前的漫漫长路