指標收集參考
https://www.cnblogs.com/throwable/p/10708351.html
https://blog.csdn.net/IT___zhao/article/details/107596427
主要指標和實現方式
ThreadPoolExecutor中提供的度量數據項獲取方式
ThreadPoolExecutor中提供的度量數據項和micrometer對應的Tag的映射關系:
線程池名稱,Tag:thread.pool.name,這個很重要,用於區分各個線程池的數據,如果使用IOC容器管理,可以使用BeanName代替。
int getCorePoolSize():核心線程數,metrics:thread.pool.core.size。
int getLargestPoolSize():歷史峰值線程數,metrics:thread.pool.largest.size。
int getMaximumPoolSize():最大線程數(線程池線程容量),metrics:thread.pool.max.size。
int getActiveCount():當前活躍線程數,metrics:thread.pool.active.size。
int getPoolSize():當前線程池中運行的線程總數(包括核心線程和非核心線程),metrics:thread.pool.thread.count。
當前任務隊列中積壓任務的總數,Tag:thread.pool.queue.size,這個需要動態計算得出。
getKeepAliveTime : 獲取線程最長的休眠時間
getTaskCount:返回線程池總共執行過的任務數--近似值
getCompletedTaskCount:返回線程池總共完成過的任務數--近似值
以上指標部分需要加鎖並根據隊列的狀態進行獲取 ,所以監控的頻率不要太快 , 以免影響效率. 另外, 監控主要是為了發現異常情況 , 比如執行很慢的任務,所以采樣頻率也不需要很快.
注意事項
四種引用的使用和特點, 參考
https://www.cnblogs.com/nullzx/p/7406151.html
因為監控時需要引用線程池對象 , 所以對於可能會銷毀的線程池 , 最好使用弱引用,避免內存泄露.
虛引用的主要特點:
- 在垃圾回收器線程掃描它 所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。
- 強 >軟>弱>虛
- 當軟引用(或弱引用,或虛引用)對象所指向的對象被回收了,那么這個引用對象本身就沒有價值了,如果程序中存在大量的這類對象(注意,我們創建的軟引用、弱引用、虛引用對象本身是個強引用,不會自動被gc回收),就會浪費內存。因此我們這就可以手動回收位於引用隊列(ReferenceQueue)中的引用對象本身. 不過,弱引用最好使用WeakHashMap, 不使用ReferenceQueue, 因為當我們調用WeakHashMap 的get和put方法會有一個副作用,即清除無效key對應的Entry,這是自動的, 否則還需要手動清除