若是隻關心具體過程,可直接迴歸正途的處理邏輯
原文連接:http://www.javashuo.com/article/p-plzezhmt-cv.htmlhtml
內存佔用率達80%+左右,而且持續上漲,最高點到94%
java
yongGC比較頻繁,在內存比較高的時候,伴有FullGC
算法
線程個個數比較多,最高點達到2w+(這個比較重要,惋惜是後面纔去關注這點)
數據庫
fastJosn error
安全
調用翻譯接口識別語種服務錯誤
網絡
對接算法提供的二方包請求錯誤
多線程
在start啓動的時候,啓動了一批定時任務
併發
定時任務中啓動了調整線程的定時任務
異步
啓動調整任務
jvm
top,觀察內存佔用率(這裏圖是重啓以後一段時間的)可是cpu佔用率比較高,很快就降下去了,這裏耽誤了一下時間,top -Hp pid,確認那個線程佔用率高,jstack看了下對應的線程在做甚
確認線程是否指定大小,未發現指定,使用的默認值大小
cat /proc/{pid}/status (線程數居然這麼多)
因爲線程數比較多,而依然能夠建立,查看Linux普通用戶所容許建立的進程數,使用命令:cat /etc/security/limits.d/90-nproc.conf ,值比較到,遠超當前的個數
線程信息
線程狀態
若是每次都new線程而不結束,gc中線程是root節點,若是線程沒有結束,不會被回收,因此若是建立大量運行的線程,會致使內存佔用量上升,可是線上到底能建立多少線程呢?
方法開始(每次都初始化一個新的客戶端,底層封裝使用httpAsyncClient,httpAsyncClient使用NIO模型,初始化包含一個boss,10個work線程)
方法結束(方法結束都調用了shutdow)
根據現象和對應線程堆棧信息,能肯定線程就是在這邊溢出,客戶端的shutDown方法關閉線程池失效,致使因爲初始的線程都是NIO模式,沒有被結束,因此線程一直積壓增長,可修改成單例模式,限制系統使用一個線程池,上線後解決問題