가비지 컬렉션(GC)와 가비지 컬렉터, 힙 메모리 기초 지식 정리
👉 가비지 컬렉션(GC)과 가비지 컬렉터
- 📌 가비지 컬렉션 (Garbage Collection)
- 가비지 컬렉션은 자바 가상 머신(JVM)의 메모리 관리 프로세스의 일부로, 더 이상 사용되지 않는 메모리(가비지)를 자동으로 식별하고 회수하는 프로세스
- 가비지 컬렉션은 사용되지 않는 객체를 식별하고, 그 메모리를 해제하여 재사용할 수 있게 만드는 과정을 포함
- 수동 메모리 관리에서 발생할 수 있는 메모리 누수를 방지하고, 효율적인 메모리 사용을 가능하게 하여 애플리케이션의 성능을 유지시킴
- 📌 가비지 컬렉터 (Garbage Collector)
- 가비지 컬렉터는 가비지 컬렉션 프로세스를 실제로 수행하는 JVM의 구성 요소
- 가비지 컬렉터는 힙 메모리 내에서 도달할 수 없는 객체들을 찾아내고, 이러한 객체들이 사용하고 있는 메모리를 해제함
- Serial, Parallel, G1, CMS 등 다양한 가비지 컬렉터가 있으며, 각각의 가비지 컬렉터는 고유의 알고리즘과 수집 방식을 가지고 있음
👉 작동 원리
- 객체의 생명주기
- 객체가 생성되어 사용되고, 더 이상 참조되지 않게 되면 가비지로 간주됨
- Reachability Analysis
- GC는 "도달 가능성 분석"을 통해 더 이상 사용되지 않는 객체를 찾음
- 도달 가능한 객체는 여전히 코드에서 사용되고 있는 객체
- Mark and Sweep
- 가장 기본적인 GC 알고리즘으로, 사용 중인 객체를 표시(Mark)한 후, 표시되지 않은 객체를 메모리에서 제거(Sweep)
👉 GC 알고리즘
- Serial GC
- 단일 스레드로 작동, 작은 애플리케이션에 적합
- Parallel GC
- 병렬로 여러 스레드에서 작동, 처리량(throughput)이 중요한 애플리케이션에 적합
- Java 8 이하 버전의 기본 GC
- Concurrent Mark Sweep (CMS) GC
- 애플리케이션의 중단 시간을 최소화하고자 하는 경우에 적합
- G1 GC
- 큰 힙을 가진 멀티프로세서 시스템에서 사용, 메모리를 여러 영역으로 나눠 관리
- Java 9 이상 버전의 기본 GC
👉 힙 메모리 영역
- Young Generation
- 새로 생성된 객체들이 저장되는 영역. 대부분의 객체가 여기서 생명을 마침
- Old Generation
- Young 영역에서 살아남은 객체들이 이동하는 영역
- 더 오래 살아남은 객체들을 위한 공간
- Permanent Generation (PermGen) / Metaspace
- 클래스 메타데이터를 저장하는 영역
- Java 8 이후 Metaspace로 대체됨
👉 GC 튜닝
- GC 튜닝은 애플리케이션의 성능을 최적화하기 위해 메모리 할당과 GC 옵션을 조절하는 과정
-Xms
와 -Xmx
옵션을 사용하여 힙 사이즈를 조절할 수 있음
- GC 로그를 분석하여 GC의 효율성과 애플리케이션의 메모리 사용 패턴을 이해하는 것이 중요
👉 역할 비유
- 가비지 컬렉션의 역할 : 청소부
- 집 안의 쓰레기를 주기적으로 청소하는 청소부와 같음
- 쓰레기가 쌓이면 공간이 부족해지고, 환경이 더러워져서 살기 불편해짐
- 마찬가지로, 프로그램에서 더 이상 쓸모없는 데이터(가비지)가 메모리를 차지하고 있으면, 메모리가 부족해져 프로그램이 느려지거나 멈출 수 있음
- GC는 이러한 불필요한 데이터를 정리하여 메모리를 깨끗하게 유지
- 가비지 컬렉션의 작동 방식 : 책상 정리
- 객체의 생명주기
- 객체들은 책상 위의 서류철 같은 것이라고 생각할 수 있음
- 필요할 때 서류철을 꺼내 사용하고, 더 이상 필요 없으면 책상에서 치워야 함
- 도달 가능성 분석(Reachability Analysis)
- GC는 어떤 서류철이 아직 필요한지, 더 이상 필요 없는지를 확인
- 책상 위에 자주 쓰는 서류철은 남겨두고, 오래동안 만지지 않은 서류철은 가비지로 간주하고 치움
- GC 알고리즘 : 다양한 청소 방법
- Serial GC
- 한 명의 청소부가 모든 청소를 담당하는 것과 같아서 작은 집에 적합
- Parallel GC
- 여러 청소부가 동시에 청소하는 것으로, 더 큰 집이나 사무실에 적합
- Concurrent Mark Sweep (CMS) GC
- 청소부가 사람들이 일하는 동안에도 조용히 청소하는 방식으로, 일의 중단을 최소화하고자 할 때 적합
- G1 GC
- 큰 건물에서 각 층마다 청소를 담당하는 청소부들이 있는 것처럼, 메모리를 여러 부분으로 나누어 관리
- 힙 메모리 : 집의 방
- Young Generation
- 새로운 객체들이 저장되는 곳으로, 마치 집에서 가장 자주 쓰는 방과 같음
- Old Generation
- Young 영역에서 살아남은 객체들이 이동하는 곳으로, 덜 자주 쓰는 방과 같음
- Permanent Generation/Metaspace
- 클래스와 메타데이터를 저장하는 곳으로, 서재나 보관실과 비슷함
- GC 튜닝 : 최적의 청소 일정 조정
- GC 튜닝은 청소부의 일정을 조정하는 것과 같음
- 너무 자주 청소하면 일하는데 방해가 되고, 너무 드물게 청소하면 쓰레기가 쌓임
➕ 힙 메모리 추가 공부(질문과 대답)
- 힙 메모리 지정(힙 메모리는 누가 지정해서 부여하는지?)
- 자동 지정
- JVM이 기본적으로 힙 메모리의 초기 크기와 최대 크기를 결정
- 이 값은 JVM 버전과 호스트 시스템의 아키텍처, 사용 가능한 메모리에 따라 다름
- 사용자 지정
- 사용자는 JVM을 시작할 때 명령줄 옵션(
-Xms
및 -Xmx
)을 사용하여 힙 메모리의 초기 크기와 최대 크기를 설정할 수 있음
- 자동으로 부여되는 힙 메모리의 크기(자동으로 부여되는 값은 얼마인지?)
- 기본값
- Java의 버전과 실행 환경에 따라 기본 힙 크기는 달라질 수 있음
- 일반적으로, 초기 힙 크기는 시스템 메모리의 일부분(예: 전체 메모리의 1/64)으로 설정되며, 최대 힙 크기는 시스템 메모리의 일부분(예: 전체 메모리의 1/4)으로 설정됨
- 힙 메모리를 늘리기 위한 사양(힙 메모리를 늘리려면 컴퓨터나 서버 사양이 좋아야 하는지?)
- 사양의 중요성
- 힙 메모리를 늘리기 위해서는 컴퓨터나 서버가 충분한 물리 메모리(RAM)를 가지고 있어야 함
- 메모리가 부족하면 힙을 늘려도 실제로는 효과가 없을 수 있음
- 성능 고려
- 더 큰 힙은 가비지 컬렉션이 더 오래 걸릴 수 있으므로, CPU 성능도 중요
- 힙 메모리 늘리기의 장단점(힙 메모리를 늘리면 어떤 장단점이 있는지?)
- 장점
- 애플리케이션에 더 많은 메모리를 할당하여 처리할 수 있으므로, 크고 복잡한 작업을 처리할 수 있음
- 메모리 부족으로 인한 성능 저하를 예방할 수 있음
- 단점
- 힙이 커지면 가비지 컬렉션에 더 많은 시간이 소요될 수 있으며, 이는 전체 애플리케이션의 응답 시간에 영향을 줄 수 있음
- 큰 힙은 메모리 관리의 복잡성을 증가시키고, 시스템의 다른 부분에 영향을 줄 수 있음