PHpullh
학습 라이브러리/Java/메모리 누수 탐지

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로 반드시 정리하세요.