2010-12-02 420 views
5

我試圖在我們的一個Java守護進程中捕獲內存泄漏,並在轉儲內存並通過內存分析工具分析後發現,大部分泄漏是由JDBC4Connection引起的:JDBC4Connection中的內存泄漏

10 instances of "com.mysql.jdbc.JDBC4Connection", loaded by "sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00" occupy 858,283,752 (81.55%) bytes. Biggest instances: 

* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 - 87,110,160 (8.28%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64af520 - 86,730,408 (8.24%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad0e0 - 86,584,048 (8.23%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64aede0 - 86,488,800 (8.22%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5320 - 85,752,872 (8.15%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ae6a0 - 85,603,280 (8.13%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64adf60 - 85,270,440 (8.10%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f4be0 - 85,248,592 (8.10%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64afc60 - 85,120,704 (8.09%) bytes. 
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5a60 - 84,374,448 (8.02%) bytes. 

Keywords 
com.mysql.jdbc.JDBC4Connection 
sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00 

我很確定我們關閉了所有的MySQL資源,但無法完全找到造成這種情況的原因。

有沒有什麼好的方法來抓住它?你有沒有經歷過這個,並可以建議我應該尋找什麼?

PS: 尋求與MAT更深,我看到以下信息:

com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 | 1,856 | 87,110,160 | 8.28% |- java.util.HashMap @ 0x2aaab62115a8 | 64 | 87,021,632 | 8.27% | '- java.util.HashMap$Entry[16384] @ 0x2aaae182e970| 131,096 | 87,021,568 | 8.27%

似乎每個JDBC擁有一個巨大的哈希映射條目的數量(> 6000個對象),並沒有釋放他們在所有。

在此先感謝!

回答

6

Duffymo幾乎肯定是對的。在過去,當我們有內存泄漏時,它實際上總是MySQL JDBC驅動程序。只是忘記關閉一個小的ResultSet或連接或語句的地方。每次我們使用這些查找問題並確保它們關閉時,我最終都會審覈整個代碼庫。

至於HashMap,我也看到了。我沒有看過源代碼,但我的印象是MySQL驅動程序在內部存儲了HashMaps中的行(至少是行值)。

泄漏ResultSets非常容易。由於這個原因,那些在JDK 7或8中進行處理的可關閉資源的想法確實吸引了我。

你可以在某處插入填充類(比如說連接)來記錄每個打開/關閉的資源,以查看是否可以在沒有直接讀取所有源代碼的情況下捕獲泄漏的位置。

+0

有點幼稚的問題。但有沒有機會在JDBC驅動程序本身中出現這個問題,並且更新它會有所幫助?或者這必須是我的代碼嚴格的東西? – SyBer 2010-12-03 18:02:40

4

我敢肯定,我們關閉所有MySQL的資源

如果不是100%肯定,請出示你如何關閉您的連接。

您使用連接池嗎?會碰巧有一個10的池大小?

+1

是的,我們使用BoneCP池。 – SyBer 2010-12-02 19:03:47