GC
- JVM 은 OS 를 이용해 동적으로 메모리 관리를 하지 않고, JVM 에 할당된 연속된 단일 메모리 풀을 관리한다.
- JVM 은 메모리를 GC 라는 알고리즘으로 관리한다.
- GC 가 어플리케이션의 성능에 영향을 미칠때
- GC 발생
- GC 발생시 각 영역에서 다른 영역으로 이동할 때 병목현상 발생
- full GC 를 수행하는 시점에는 해당 JVM 에서 처리되지 않기 때문에 GC가 자주 수행되면 응답 시간에 많은 영향을 끼친다. → 상황에 맞는 GC 알고리즘이 선택이 중요하다.
- 가비지 콜렉터의 역할
-
메모리 할당
-
사용중인 메모리 인식
-
사용하지 않는 메모리 인식
이 작업을 안하면 무슨일이 발생할까?
- 메모리 영역이 꽉차서 hang 발생 가능
- 메모리가 부족할때마다 계속 늘리다가 한계에 도달하면 OOME 발생하여 JVM 이 다운될 수 있음
- GC는 Deamon Thread 에서 수행된다. (백그라운드 스레드에서 수행된다)
자바는 시스템 콜을 하지 않는다.
GC 가 일어나는 주된 원인
- 할당률
- 정의 : 일정 기간 새로 생성된 객체가 사용한 메모리량
- 객체 수명
→ GC 알고리즘의 트레이드오프가 이 두 요인과 직결되어있다.
약한 세대별 가설 (Weak Generational Hypothesis)
JVM 및 유사 소프트웨어 시스템에서 객체 수명은 이원적(bimodal) 분포 양상을 보인다.
거의 대부분 객체는 아주 짧은 시간만 살아있지만, 나머지 객체는 기대 수명이 훨씬 길다.
Mark and Sweep, Compaction
- 가비지 콜렉터는 매시간마다 더이상 참조되지 않는 객체를 찾아내 메모리에서 삭제한다.
이 확보된 공간은 새로운 객체 할당에 사용된다.
- GC 의 기본 알고리즘이다
!https://miro.medium.com/v2/resize:fit:1400/1*j8EdlKY3a1zJInwzLdWvNg.png
Mark
- 정의 : 살아있는 객체를 식별하는 것
- 내부 동작
- GC 루트부터 살아있는 객체(live objects)를 찾아 표시(mark bit)한다.
- live objects 탐색 방법
- 객체 참조값은 그래프 형태로 참조된다. (live object graph)
- 그래프 자료구조에서 루프 노드가 되는 곳이 GC root 라고 보면 된다.
GC root 에서부터 DFS 방식으로 탐색하며 객체에 mark bit 표시를 하는 것이다.
- GC ROOT
- 정의
- Stack frame
- 메서드 static 데이터
- JNI 로 만들어진 데이터
- 로드된 클래스의 메타데이터
- … 더 있음
Sweep
- 고아객체를 메모리에서 할당 해제하는 것
- mark bit 표시 안된 객체를 찾는다.
- heap 영역에서 메모리를 회수해 free list 에 되돌린다.
- 객체를 삭제한다.
Compaction
살아있는 객체를 다른 survivor 영역에 옮기면서 연속된 공간에 할당한다.
GC 발생 시점?
- 메모리 할당 요청을 수용하기에 메모리가 부족할때 작동하여 필요한 만큼 메모리를 공급한다.
- 고정된 시간 간격으로 발생하는게 아니라 그때그때 필요에 의해 발생한다.
GC 알고리즘
1. Serial GC
- 단순 mark-sweep-compact 알고리즘 사용 & Minor GC & Major GC 를 사용한다.
- 하나의 CPU 를 사용한다.
- 적은 메모리와 낮은 CPU 를 사용하는 클라이언트 머신 어플리케이션에 적합하다.
- 대기 시간이 많아도 크게 문제되지 않는 시스템에 적합
2. Parallel GC
- throughput collector 로도 알려진 방식
- 목표 : 다른 CPU 가 대기 상태로 남아 있는 것을 최소화 하는 것
- Young 영역에서 GC 를 병렬로 처리한다.
- 많은 CPU 를 사용하기 때문에 GC의 부하를 줄이고 애플리케이션의 처리량 증가시킬 수 있다.
- mark-sweep-compact 알고리즘 사용
- 객체를 방출하는 반구형 수집기
3. Parallel Old GC (병렬 콤팩팅 콜렉터)
- Old 영역에서 GC 를 병렬로 처리한다.
- 하나의 연속된 메모리 공간에서 압착하는 수집기다.
4. Concurrent Mark Sweep
Garbage Collection Algorithms: Concurrent Mark Sweep, Fragmentation and Compaction, Lost Writes
- 2개 이상의 프로세서를 사용하는 서버에 적당하다. ex) 웹 서버
- CPU 가 많지 않고 시스템의 대기 시간이 짧아야 할 때 사용하면 좋다.