자바에서 메모리 관리는 핵심적인 요소 중 하나입니다. 이를 자동화한 메커니즘이 바로 '가비지 컬렉션(GC)'입니다. GC는 더 이상 사용하지 않는 메모리를 자동으로 회수하는 역할을 하며, 이는 개발자가 직접 메모리를 관리하지 않아도 되게 하여 코드의 복잡성을 줄이고 버그를 줄여줍니다. 그렇다면 자바의 GC는 어떻게 동작할까요? 이 포스트에서는 GC의 동작 과정을 이해하기 쉽게 설명하겠습니다.
GC의 필요성
객체 지향 프로그래밍에서는 수많은 객체가 생성되고 소멸됩니다. 이런 객체들은 힙(heap)이라는 공간에 저장되는데, 만약 이 공간이 꽉 차면 새로운 객체를 생성할 수 없게 됩니다. 개발자가 직접 메모리를 관리하는 C/C++에서는 메모리 누수(memory leak)와 같은 문제가 발생할 수 있습니다. 반면, 자바에서는 GC가 더 이상 필요 없는 객체를 찾아내서 자동으로 제거함으로써 이런 문제를 방지합니다.
GC의 동작 원리
가비지 컬렉션의 동작 원리를 이해하기 위해서는 먼저 자바의 힙 구조를 알아야 합니다. 자바의 힙은 크게 Young Generation, Old Generation, 그리고 Permanent Generation으로 나눌 수 있습니다.
Young Generation: 새로 생성된 객체들이 배치되는 공간입니다. 이 공간은 다시 Eden space와 두 개의 Survivor space(S0, S1)로 나누어집니다. 대부분의 객체는 Eden에서 생성되고, GC가 동작할 때 살아남은 객체들은 Survivor space로 이동합니다.
Old Generation: Young Generation에서 오랫동안 살아남은 객체들이 이동하는 공간입니다.
Permanent Generation: JVM이 사용하는 메타 데이터를 저장하는 공간입니다.
GC의 동작 과정은 크게 'Minor GC'와 'Major GC(Full GC)' 두 가지로 나뉩니다.
Minor GC: Young Generation 영역에서 발생하는 GC입니다. Eden Space가 가득 차면 GC가 발생하며, 여기에 있는 불필요한 객체들을 제거합니다. 살아남은 객체들은 Survivor Space로 이동하게 됩니다.
Major GC(Full GC): Old Generation 영역에서 발생하는 GC입니다. 이 GC가 발생하면 전체 힙 영역을 대상으로 메모리를 정리합니다. 이 과정에서 더 이상 사용되지 않는 객체들이 제거되며, 이 과정은 Minor GC보다 오랫동안 걸리며, 이동하는 동안에는 어플리케이션의 동작이 일시 중단될 수 있습니다(Stop-the-world).
이렇게 GC는 프로그램의 동작 중 필요하지 않은 객체를 효과적으로 찾아내어 메모리를 자동으로 회수하고 관리하므로 개발자는 복잡한 메모리 관리를 신경쓰지 않고 로직에 집중할 수 있습니다. 하지만 GC가 언제, 어떻게 동작할지를 이해하고 있으면 효율적인 코드를 작성하고 성능 문제를 해결하는데 도움이 됩니다.
'Java' 카테고리의 다른 글
자바 버전별 주요 기능: Java 8, 11, 17의 혁신 (1) | 2023.12.08 |
---|---|
G1 GC 동작 원리: 핵심 요소를 통한 깊이있는 이해 (0) | 2023.06.13 |
싱글톤 패턴(Singleton Pattern): 그것이 무엇인가? (0) | 2023.05.28 |
추상 클래스와 인터페이스: 이해와 차이점 (0) | 2023.05.27 |
멀티스레딩 문제 해결하기: 다양한 접근 방법들 (0) | 2023.05.27 |