這時候猜想是某個地方頻繁建立對象致使,經過jmap -dump:format=b,file=temp.dump 5280
dump文件,而後下載到本地經過jvisualvm分析對象的引用鏈的方式來定位具體頻繁建立對象的地方,dump文件下載下來有5G多,整個導入過程都花了10多分鐘。想查看所佔空間較多對象的引用鏈,直接OOM了,dump對象太大了。這時候就換了種思路,查看佔用空間比較大的一系列對象,看能不能找出什麼端倪。佔用空間最大的幾類對象以下圖
發現排第一的chart[]
對象裏面,存在一些metrics監控的具體指標的相關內容,排第二的io.prometheus.client.Collector$MetricFamilySample$Sample
和排第9和第13對象都是spring boot中metrics指標監控相關的對象,因此此時懷疑metrics監控的某個地方在頻繁建立對象,首先考慮的是否由於metrics指標太多致使的,因而登陸線上機器curl localhost:8080/mertrics > metrics.log
,發現響應內容有50多M,參考其餘相關的正常應用,指標總共內容也就10多M左右,打開指標內容發現了不少相似以下圖的指標
看到了這裏已經能夠肯定代碼中上報這個指標是存在問題的,並無達到咱們想要的效果,因此也懷疑也是這個地方致使的Full GC頻繁。html
因爲這個指標也可有可無,初步解決方案就把上報該指標的代碼給幹掉。上線後看下Full GC問題是否會獲得改善,果真,上線後Full GC告警問題已經解決。java
import java.util.Map; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** * 線程池經過submit方式提交任務,會把Runnable封裝成FutureTask。 * 直接致使了Runnable重寫的toString方法在afterExecute統計的時候沒有起到咱們想要的做用, * 最終致使幾乎每個任務(除非hashCode相同)就按照一類任務進行統計。因此這個metricsMap會愈來愈大,調用metrics接口的時候,會把該map轉成一個字符返回 */ public class GCTest { /** * 統計各種任務已經執行的數量 * 此處爲了簡化代碼,只用map來代替metrics統計 */ private static Map<String, AtomicInteger> metricsMap = new ConcurrentHashMap<>(); public static void main(String[] args) throws InterruptedException { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>()){ /** * 統計各種任務執行的數量 * @param r * @param t */ @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); metricsMap.compute(r.toString(), (s, atomicInteger) -> new AtomicInteger(atomicInteger == null ? 0 : atomicInteger.incrementAndGet())); } }; /** * 源源不斷的任務添加進線程池被執行 */ for (int i =0; i < 1000; i++) { threadPoolExecutor.submit(new SimpleRunnable()); } Thread.sleep(1000 * 2); System.out.println(metricsMap); threadPoolExecutor.shutdownNow(); } static class SimpleRunnable implements Runnable{ @Override public void run() { System.out.println("SimpleRunnable execute success"); } /** * 重寫toString用於統計任務數 * @return */ @Override public String toString(){ return this.getClass().getSimpleName(); } } }
版權聲明
做者:wycm
出處:https://www.cnblogs.com/w-y-c-m/p/9919717.html
您的支持是對博主最大的鼓勵,感謝您的認真閱讀。
本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
程序員