자바는 객체 지향 프로그래밍 언어로 개발자들이 객체를 생성하고 조작하는 데 집중할 수 있도록 메모리 관리의 많은 부분을 자동화합니다.
이 자동 메모리 관리는 주로 가비지 컬렉션(Garbage Collection, GC)을 통해 이루어집니다.
같은 GC를 가지고 있는 언어의 대표적인 예는 C#, Python, JS, GO 등이 있습니다.
자바 애플리케이션이 실행될 때, JVM(Java Virtual Machine)은 다양한 메모리 영역을 할당하여 객체를 저장하고 관리합니다. 주요 메모리 영역은 다음과 같습니다
힙(Heap)의 구조:
Young Generation에서 빈번한 Minor GC가 발생하고, Old Generation에서는 더 적은 빈도로 Major GC가 발생하여 메모리를 정리합니다.
따라서 힙 메모리 내의 Young Generation과 Old Generation의 구분은 JVM 메모리 관리의 핵심이며 이를 통해 객체의 수명 주기에 따라 효율적으로 메모리를 관리할 수 있게 됩니다.
가비지 컬렉션은 더 이상 참조되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 누수를 방지하고 메모리 사용을 최적화하는 자바의 메커니즘입니다. 개발자는 객체를 생성하고 참조를 관리하는 데 집중할 수 있으며 GC가 필요하지 않은 객체를 찾아 자동으로 정리합니다.
GC는 주로 다음과 같은 단계로 동작합니다:
도달 가능성은 객체가 여전히 참조되고 있는지 여부에 따라 결정됩니다. 객체가 더 이상 참조되지 않으면 그 객체는 가비지 컬렉션의 대상이 됩니다. 참조의 유형에는 강한 참조(Strong Reference), 약한 참조(Weak Reference), 순환 참조 등이 있습니다.
도달 가능성(Reachability)은 객체가 프로그램 실행 중에서 여전히 참조되고 있는지 여부를 의미합니다. 자바의 가비지 컬렉터는 특정 객체에 대해 더 이상 참조가 존재하지 않으면 그 객체를 가비지로 간주하고 메모리에서 회수합니다.
강한 참조(Strong Reference):
MyObject obj = new MyObject(); // 강한 참조
obj
가 참조를 유지하는 한 이 객체는 절대 GC의 대상이 되지 않습니다.약한 참조(Weak Reference):
WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject());
weakRef
는 약한 참조이므로, 강한 참조가 없는 상태에서는 GC가 이 객체를 수집할 수 있습니다.소프트 참조(Soft Reference):
SoftReference<MyObject> softRef = new SoftReference<>(new MyObject());
팬텀 참조(Phantom Reference):
PhantomReference<MyObject> phantomRef = new PhantomReference<>(new MyObject(), referenceQueue);
순환 참조는 객체들이 서로를 참조하는 경우를 말합니다. 순환 참조가 있어도 외부에서 더 이상 해당 객체들을 참조하지 않으면 GC는 이 객체들을 회수할 수 있습니다.
가비지 컬렉션이 작동할 때, JVM은 GC 루트(GC Roots)라고 불리는 특별한 참조 집합에서 출발하여 객체 그래프를 탐색합니다. 이 과정에서 GC는 도달 가능한 객체는 계속 유지하고, 도달할 수 없는 객체는 가비지로 간주하여 메모리에서 제거합니다.
GC 루트로 간주되는 것들:
이 설명을 바탕으로 GC 동작의 도달 가능성과 참조 유형에 대해 더 명확히 이해할 수 있을 것입니다.
자바는 다양한 GC 알고리즘을 제공하며 각 알고리즘은 특정 시나리오에 최적화되어 있습니다.
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
-XX:+UseZGC
-XX:+UseShenandoahGC
GC 로그를 분석하면 애플리케이션의 메모리 사용 패턴과 GC의 성능을 파악할 수 있습니다. 자바는 -Xlog:gc
옵션을 통해 GC 로그를 활성화할 수 있습니다.
예시 로그:
[0.016s][info][gc] Using G1
[0.018s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 512M->256M(1024M) 15.123ms
[0.034s][info][gc] GC(1) Pause Full (Normal) (G1 Humongous Allocation) 256M->128M(1024M) 45.678ms
해석:
자바의 가비지 컬렉션은 메모리 관리를 자동화하여 개발자가 메모리 할당과 해제에 대한 부담을 덜어줍니다. 다양한 GC 알고리즘과 옵션을 통해 애플리케이션의 특성에 맞게 메모리 관리를 최적화할 수 있습니다. 효과적인 GC 관리와 튜닝은 애플리케이션의 성능과 안정성을 높이는 데 중요한 역할을 합니다.