記CXF中的一次Non Heap記憶體洩露

2021-07-24 08:40:45 字數 840 閱讀 9313

最近遇到乙個webservice記憶體洩露的問題。使用jconsole連線後發現非堆記憶體和loaded classes在每次執行full gc後都會增長。classes增長的非常有規律,每次增加5000個左右。

因為cxf中使用了jaxb,懷疑是jaxb被多次例項化造成的。然後使用mat,查詢duplicate classes,不過mat顯示沒有duplicate classes。

沒辦法,改用jvm引數追蹤

* -xx:+traceclassloading

* -xx:+traceclassunloading

在trace日誌中確認就是webservice相關的那些classes被多次載入了

剩下的問題就是調查**的jaxb被重複例項化了。跟蹤發現cxf使用乙個cachemap來儲存構造過的webservice類。

private static final map>, cachedcontextandschemas> jaxbcontext_cache 

= new cachemap>, cachedcontextandschemas>();

........

synchronized (jaxbcontext_cache)

if (cachedcontextandschemas == null)

}

cachemap中的key是weak references,value是strong references。所以gc時候會**對應的key,但是schema仍存留在記憶體中。一旦在cache中沒有發現key,就會重新例項化!!

解決方法也很簡單,jaxbcontext_cache使用hashmap就可以了。

記一次的使用

將jsp拆分frame框架,因為採用了第一種方式,一直在考慮用jquery非同步請求獲取資料,總是但不到效果,終於在js寫吐的時候選擇了第二種方式。參考網上的使用,大多是下面這個樣子,如果涉及靜態頁面之間定位,是沒有問題的 href 為目標頁面 通過target定位到frame views main...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次 EqualsAndHashCode的疑惑

lombok的使用真的是讓開發人員欲罷不能,乙個 data不管有多少屬性全部搞定,以後加字段也不用從新生成get和set方法。不過這裡還是有乙個小坑需要注意一下,舉個例子 public class equalsandhashcodetest data noargsconstructor access...