[Java] 메모리 관리 및 가비지 컬렉션
KUKJIN LEE • 2개월 전 작성
Java에서의 메모리 관리는 자동화된 가비지 컬렉션(GC) 덕분에 개발자가 직접 메모리를 해제할 필요가 없습니다.
(고성능의 경우에는 메모리 관리와 가비지 컬렉션에 대한 이해가 필수적입니다. 즉 직접 메모리를 관리해야 한다는 뜻입니다.)
1. Java 메모리 구조
Java 메모리는 JVM에서 관리되며, 주요 메모리 영역은 다음과 같이 나뉩니다.
-
Heap(힙) 메모리: 객체가 생성되는 영역으로, Young Generation(객체가 처음 생성)과 Old Generation(장기 생존 객체)이 있습니다.
-
Stack(스택) 메모리: 지역 변수와 메서드 호출에 사용됩니다.
-
Method Area(메서드 영역): 클래스 메타데이터와 상수들이 저장됩니다.
-
PC Register(프로그램 카운터) 및 Native Method Stack: 각 스레드가 실행할 명령과 네이티브 코드가 사용하는 메모리입니다.
2. 가비지 컬렉션(GC) 기본 원리
가비지 컬렉션(Garbage Collection)은 JVM에서 더 이상 참조되지 않는 객체를 자동으로 제거해 메모리를 회수하는 메커니즘입니다. 객체의 참조 여부를 기준으로 GC가 불필요한 메모리를 해제해 주며, 메모리 누수를 방지합니다.
2.1 가비지 컬렉션의 과정
-
Mark(마킹): 살아 있는 객체를 식별합니다.
-
Sweep(제거): 사용되지 않는 객체를 메모리에서 해제합니다.
-
Compact(압축): 메모리 단편화를 방지하기 위해 남아 있는 객체를 재배치합니다.
2.2 가비지 컬렉션의 종류
-
Minor GC: Young Generation에서 객체를 제거.
-
Major GC: Old Generation에서 객체를 제거.
-
Full GC: Young과 Old Generation을 모두 정리하는 작업(성능에 큰 영향을 미침).
일반적인 개발 업무에서 대부분 JVM의 기본 메모리 관리와 가비지 컬렉션(GC) 설정으로 충분합니다. 메모리 관리 GC 최적화에 신경 쓸 일이 없습니다. 특히 웹 개발은 성능 문제나 메모리 부족이 발생 확률이 낮습니다. (차라리 코드 최적화가 더 도움이 됩니다.)
(대규모, 대용량 데이터를 처리하고 서버 자원이 제한적일 때 문제가 발생합니다.)