당신의 MySQL Connector, 안전한가요? (feat.메모리 누수)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Java/Spring Boot 개발자 및 데이터베이스 관리자
- 중급~고급 수준의 JVM, 메모리 관리, HikariCP 이해 필요
- MySQL 커넥터와 연결 풀 설정에 대한 실무 경험자
핵심 요약
- AbandonedConnectionCleanupThread가 메모리 누수의 원인임을 Heap Dump 분석으로 확인
- HikariCP의 max-lifetime 설정이 짧아지면 AbandonedConnection 누적으로 병목 발생
- 두 가지 해결책 제시:
max-lifetime 조정
또는AbandonedConnectionCleanupThread 비활성화
섹션별 세부 요약
###Situaction
- Heap 사용량 90% 이상으로 GC 수행 시 메모리 감소 없음 → 메모리 누수 의심
- Grafana 대시보드를 통해 Eden Space 및 GC Count 분석
- Heap Dump 생성 및 MAT 분석으로 MySQL Connection 관련 누수 발견
###AbandonedConnectionCleanupThread, 너 누군데?
- HikariCP 2.0 이상에서 제공되는 Connection 정리 스레드
newSingleThreadExecutor
로 단일 스레드로 실행 → 병목 가능성NetworkResources.forceClose()
호출로 네트워크 리소스 종료 시도
###Action
- max-lifetime 값을 30분(디폴트)으로 조정 → AbandonedConnection 누적 속도 감소
- MySQL Connector 8.0.22 이상 업그레이드 및
-Dcom.mysql.cj.disableAbandonedConnectionCleanup=true
설정으로 스레드 비활성화
###Result
- Heap 사용량 감소 및 메모리 누수 해결 확인
- HikariCP HouseKeeper가 커넥션 관리 역할 수행 → AbandonedConnectionCleanupThread 필요성 감소
결론
- HikariCP의 max-lifetime 설정을 적절히 조정하거나, AbandonedConnectionCleanupThread 비활성화를 통해 메모리 누수 예방
- MySQL Connector 8.0.22 이상 업그레이드를 권장하며,
-Dcom.mysql.cj.disableAbandonedConnectionCleanup=true
설정으로 스레드 비활성화 적용 - Heap Dump 분석 및 JDK 도구 활용을 통해 메모리 문제 식별 및 해결 가능