天天看點

一個比較明顯的OOM的排查過程

淘江湖由于之前遇到過因爬蟲導緻對使用者中心的通路飚高而險些發生問題的情況,是以在其最近的一個項目中更新TDDL到2.4.4版本,以使用tddl的流控功能。但是在一次壓測6個小時後産生了OOM異常。用曉鋒的TProfiler分析結果是:

num #instances #bytes class name
———————————————-
1: 880137 104619672 char[]
914733 21953592 | +–java.lang.String
774175 37160400 | | +–com.********Profiler$Entry
790764 31074808 | | | +–java.lang.Object[]
781966 18767184 | | | | |–java.util.ArrayList
…
790764 31074808 | | +–java.lang.Object[]
781966 18767184 | | | +–java.util.ArrayList
774175 37160400 | | | | |–com.********Profiler$Entry
…      

直接用jmap-histo檢視結果是:

num #instances #bytes class name
———————————————-
1: 4542494 544227352 [C
2: 4429530 212617440 com.********Profiler$Entry
3: 4451761 165336648 [Ljava.lang.Object;
4: 4577468 109859232 java.lang.String
5: 4439023 106536552 java.util.ArrayList
6: 18058 24432336 [I
…      

步認為是com.**.Profiler沒有release造成的問題,但是業務方的代碼隻有兩行調用了Profiler,

包括其引用的jar包的代碼中也沒有發現忘記release的地方。

再用Mat分析過dump檔案,一個線程引用了490多M的對象,Profiler$Entry本身占了92M的記憶體,但是占用了480M空間,

是以确定無疑是Profiler沒有release造成的,是以寫了一個BTrace腳本跟蹤Profiler的enter和release調用,結果如下

com.taobao.matrix.center.interceptor.ProfilerInterceptor.invoke(ProfilerInterceptor.java:14)=1541000enter

com.alibaba.webx.filter.timer.TimerFilter.doFilter(TimerFilter.java:97)=1enter

com.taobao.matrix.center.interceptor.ProfilerInterceptor.invoke(ProfilerInterceptor.java:17)=1541000release

繼續閱讀