Java Garbage Collection 이란? Mark and Sweep, Young, Old, Perm 개념 정리
- Java 프로그래밍을 하다보면 Garbage Collection 이라는 용어를 자주 듣게 됩니다. 개발 초반에는 해당 지식이 없어도 개발이 가능하지만, 성능 최적화나 메모리 누수 등을 방지하기 위해 알아두면 좋은 내용입니다.
- Java 를 사용하는 회사 면접에서도 자주 물어보는 주제 중 하나입니다.
- 이 문서에서는 Java Garbage Collection 에 대해 쉽게 이해할 수 있도록 정리해보겠습니다.
- 모르는 개념을 이해하기 위하여 간단히 정리한 내용이므로, 자세한 내용은 다른 글을 확인하면서 공부하시는 것을 추천드립니다.
Garbage Collection 이란?
- Garbage Collection 이라는 이름은 쓰레기 수집이라는 뜻. 사용하지 않는 메모리를 자동으로 수집하는 기능
- 사용하지 않는 메모리: 더 이상 사용되지 않는 메모리
- 메모리 수집: 사용하지 않는 메모리를 해제하여 다시 사용할 수 있도록 함
- 자바 메모리 관리는 JVM을 통해 이루어짐
- 기존 언어는 메모리 할당과 해제를 프로그래머가 직접 처리해야 했음. 메모리 해제를 제대로 하지 않으면 사용하지 않는 메모리가 계속 쌓여 메모리 누수(memory leak)가 발생
- JVM은 가상머신으로, 사용자가 신경쓸 필요 없이 자동으로 메모리 할당과 해제를 처리함
- 프로그램 실행시 JVM 옵션을 주어서 JVM 이 사용할 메모리 크기를 지정
- OS 레벨의 메모리에 직접 접근하지 않아 OS 레벨에서의 memory leak은 방지됨
- Garbage Collection은 힙 영역에서 unreachable 객체들을 제거하여 메모리를 확보함
- unreachable 객체: 더 이상 참조되지 않는 객체
Mark and Sweep 이란?
- 특징
- 가비지 컬렉션은 Mark and Sweep 방식으로 이루어짐
- 가비지 컬렉션 후의 메모리 상태는 메모리 공간이 확보된 상태
Mark
- Reachable 객체를 찾아 마킹함. Garbage Collector 가 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스하는지 찾음
- Mark 작업을 위해 모든 스레드는 중단되는데, 이를 stop the world 라고 함
- 위의 이유로 System.gc()를 호출하여 명시적으로 가비지 컬렉션을 일으킬 수 있으나 권장되지 않음
Sweep