른록노트
[JVM] GC란? (Garbage Collection) 본문
Tutorials and Documents
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/generations.html#sthref16
1. GC (Garbage Collection) 가비지 컬렉션
자바는 실행될때 자바 자체 운영체제에서 돌아가는데 그게 바로 자바 가상머신JVM이고 이때 사용되는 객체를 자동으로 관리해 주는 기능이 가비지 컬렉션입니다. 객체는 JVM Heap 영역에 저장되며 크게 세 영역으로 나눠져 있습니다.
Young 영역, Old 영역, Perm 영역이 있습니다. Perm은 JDK8버전부터 Metaspace로 변경되었습니다.
그리고 가비지 컬렉션이 일어날때 처리중인 프로그램은 잠시 멈추게 됩니다. (Stop the World Event)
1) 영역
- Young : 생성된지 얼마 안된 객체들이 저장되는 장소이고 Eden 영역과 두개의 서바이버 영역으로 나뉘어 있습니다. 여기서 GC가 일어나는걸 Minor GC라고 합니다.
- Old : 이곳은 오랫동안 사용중인 객체들이 저장되는 장소입니다. 여기서 GC가 일어나는걸 Full GC라고 하며 Minor GC보다 시간이 많이 걸립니다.
- Perm -> Metaspace : 이곳은 클래스, 메타데이터가 저장되는 곳 입니다.
2) 가비지 컬렉션과 가비지 컬렉터
가비지 컬렉션은 Minor GC, Full GC 같이 메모리를 비워주는 동작을 말합니다
가비지 컬렉터는 가비지 컬렉션을 동작하는 알고리즘입니다. java를 실행하기전에 옵션을 지정해 줄 수 있습니다.
3) 가비지 컬렉션 종류
- Minor GC : Young 영역에서 일어나며 작동방식은 Eden영역이 가득차게되면 참조되지 않는 객체들은 비우고 남은 객체들을 서바이버 영역으로 옮기는데 Generational GC라고 하며 이때 한쪽의 서바이버 영역은 비워져 있어야 합니다. 그리고 서바이버 영역으로 옮길 때마다 기존에 저장되있는 객체들의 age값이 늘어나며 이과정을 aging이라고하며 기준 age값을 넘어가면 Old 영역으로 올라갑니다. 이를 promotion이라고 합니다.
- Full GC : Old 영역도 Young 영역처럼 메모리가 가득차면 똑같은 GC가 일어나는데 이를 Full GC라고 합니다. Minor GC보다 시간이 오래걸립니다.
4) 가비지 컬렉터 종류
- Serial Collector : 이전에 말한 Minor GC와 Full GC가 하나의 쓰레드에서 이루어지는것입니다. (만약 어플리케이션이 대략 100MB정도 데이터셋을 사용한다면 추천합니다. 그리고 단일 프로세서에서 실행되고 Stop the World 요구사항이 없는 경우)
-XX:+UseSerialGC
- Parallel Collector : Serial Collector를 병렬화 한것입니다. 멀티CPU에서 성능이 좋습니다. 추가적으로 Paralle compaction은 기본으로 주요 Collector를 병렬로 멀티쓰레드에서 수행할 수 있도록하는데, 이 기능을 사용하지 않으려면 옵션을 추가해서 비활성화 할 수 있습니다. (1초 이상의 Stop the World가 허용되고 성능을 최우선으로 한다면 추천합니다.)
-XX:+UseParallelGC
- Concurrent Mark Sweep (CMS) : Stop the World 시간이 처리량 보다 중요하거나 1초 미만을 유지해야 한다면 추천합니다.
-XX:+UseConcMarkSweepGC
- Garbage-First (G1) : 대용량 메모리가 있는 멀티 프로세서 시스템용으로 높은 처리량을 달성하면서 높은 확률로 Stop the World 시간도 줄여줍니다.
-XX:+UseG1GC
- (CMS와 G1은 cpu 자원이 필요하여 적절한 선택이 필요합니다.)
반응형
Comments