2010-12-02 9 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는 HashMap의 항목의 엄청난 금액을 (> 6000 개체) 보유 것, 그리고 그들을 해제하지 않습니다 조금도.

미리 감사드립니다.

답변

6

Duffymo는 거의 확실합니다. 과거에는 메모리 누수가 발생했을 때 실제로는 MySQL JDBC 드라이버입니다. 하나의 작은 ResultSet 또는 Connection 또는 Statement를 어딘가에 닫는 것을 잊어 버렸습니다. 문제를 발견하고 닫히게 할 때마다 코드베이스 전체를 감사하게되었습니다.

HashMap에 관해서도 나는 그것을 보았습니다. 내가 소스를 보지 못했지만 MySQL 드라이버가 내부적으로 HashMaps에 행 (적어도 행 값)을 저장했다는 인상을 받았다.

ResultSet을 누출하는 것은 슬프게 쉽습니다. JDK 7 또는 8에 들어있는이 문제를 처리하는 클로즈 가능한 리소스에 대한 아이디어는 이러한 이유로 내게 정말로 호소력을 발휘합니다.

Shim 클래스를 Connection에 삽입하여 열거 나 닫힌 각 리소스를 기록하여 모든 소스를 직접 읽지 않고 누출 위치를 파악할 수 있습니다.

+0

조금 순진한 질문입니다. 그러나 JDBC 드라이버 자체에서 문제가 될 가능성이 있으며이를 업데이트하면 도움이 될 것입니다. 아니면 엄격하게 내 코드에 있어야할까요? – SyBer

+0

shim 클래스 아이디어를 보내 주셔서 감사합니다. – SyBer

+1

JDBC 드라이버에 누수가있을 수 있습니다. 릴리스 정보를 읽으면 수정 된 것으로 표시됩니다. 3 년에서 4 년 동안이 재료로 작업 한 결과, 내가 누출되었을 수있는 누출을 발견하지 못했습니다. – MBCook

4

는 우리가 당신이 당신의 연결을 종료하고 방법을 보여주십시오 MySQL의 모든 자원

100 % 확인하는 경우를 닫는 것을 확신합니다.

연결 풀을 사용하고 있습니까? 수영장 크기가 10이 될까요?

+1

예, 우리는 BoneCP 풀을 사용합니다. – SyBer

관련 문제