JAVA · 성능/JVM
메모리 누수 탐지
일반적인 Java 메모리 누수 패턴과 탐지 방법입니다.
성능/JVM고급메모리누수WeakReferenceHeapDump진단
핵심 설명
일반적인 Java 메모리 누수 패턴과 탐지 방법입니다.
Java code
import java.util.*;
public class MemoryLeakDetection {
// 누수 패턴 1: static 컬렉션에 계속 추가
static final List<byte[]> leakyCache = new ArrayList<>();
// 누수 패턴 2: 리스너 미해제
static final List<Runnable> listeners = new ArrayList<>();
// 누수 패턴 3: 내부 클래스의 외부 참조
class InnerClass {
// 암묵적으로 OuterClass 참조 유지
void doWork() { }
}
// 해결: WeakReference 사용
static class SafeCache<K, V> {
private final Map<K, java.lang.ref.WeakReference<V>> cache =
new HashMap<>();
void put(K key, V value) {
cache.put(key, new java.lang.ref.WeakReference<>(value));
}
Optional<V> get(K key) {
var ref = cache.get(key);
if (ref == null) return Optional.empty();
V value = ref.get();
if (value == null) {
cache.remove(key); // 정리
return Optional.empty();
}
return Optional.of(value);
}
}
public static void main(String[] args) {
System.out.println("메모리 누수 탐지 방법:");
System.out.println("1. -XX:+HeapDumpOnOutOfMemoryError");
System.out.println("2. JFR로 객체 할당 추적");
System.out.println("3. Eclipse MAT의 Leak Suspects");
System.out.println("4. VisualVM 실시간 모니터링");
System.out.println("\n주요 누수 패턴:");
System.out.println("- static 컬렉션 무한 증가");
System.out.println("- 이벤트 리스너 미해제");
System.out.println("- 내부 클래스의 외부 참조");
System.out.println("- 커넥션/스트림 미닫기");
System.out.println("- ThreadLocal 미정리");
}
}학습 팁
WeakHashMap은 키가 GC되면 자동으로 엔트리가 제거됩니다. 캐시에서 메모리 누수를 방지하는 데 유용합니다.
주의할 점
ThreadLocal 값을 remove()하지 않으면 스레드 풀에서 메모리 누수가 발생합니다. try-finally로 반드시 정리하세요.
자주 묻는 질문
메모리 누수 탐지란 무엇인가요?
일반적인 Java 메모리 누수 패턴과 탐지 방법입니다.
메모리 누수 탐지 학습 시 주의할 점은 무엇인가요?
ThreadLocal 값을 remove() 하지 않으면 스레드 풀에서 메모리 누수가 발생합니다. try-finally로 반드시 정리하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.