카테고리 없음

[JAVA] Garbage Collector (가비지 컬렉터) 기본 개념

우디혜 2022. 3. 5. 19:57

기본 배경 지식 

- Object는 heap 영역에 할당 (static, class 정의 등의 메타 데이터들은 method area에 할당)

- Garbage Collection은 Garbage Collector라는 데몬 쓰레드에 의해서 수행된다

- GC를 강제로 실행시킬 수는 없다

- heap이 꽉 차서 새로운 할당을 하지 못할 경우 OutOfMemory가 발생한다

🙋‍♀️ 데몬 쓰레드
        - 사용자가 직접 조작하지 않고, 백 그라운드에서 작업하는 스레드       
        - 일반 스레드가 모두 종료되면, 데몬 스레드는 강제 종료된다

 

Garbage Collection

- 자바 언어에서 제공하는 자동 메모리 관리자

- 더 이상 사용하지 않는 객체들의 메모리 할당을 해제하는 역할을 한다

- 객체의 나이에 따라 힙을 두 가지 generation 영역으로 분리하여 저장한다 (Young / Old)

 

 

Object의 상태

- 실제로 사용하고있는지 여부에 따라 : live / dead object

- 실제 참조되고 있는지 여부에 따라 : reachable / unreachable object

 

Reachable BUT NOT Live Object
  - Memory Leak 주범 (OutOfMemory Exception 야기)

 

GC의 주요 업무(?)

Mark : starts from root node of the application(main), walks the object graph, marks objects that are reachable as live (참조되고 있는 객체인지 마킹)

Delete : Delete unreachable objects (가장 널리 알려진 GC의 기능)

Compacting : Compact the memory by moving around the objects and making the allocation contiguous than fragmented (메모리 단편화를 막기 위함)

 

 

Generational Collector

 

 

Young Generation

새로운 Object들이 할당되는 공간

 

 - Eden Space : Object가 Heap에 최초로 할당되는 공간 (by 성경, 생명이 에덴동산에서 처음 탄생)

 - Survivor Space : Minor GC 수행 시 살아남은(참조가 있는) Object들이 잠시 머무르는 곳

 

Minor GC 동작 과정

1)  GC가 Eden Space의 모든 Object를 탐색하며 Reachable Object만을 Mark

2) Reachable Object를 Survivor Space로 이동

3) Unreachable Object 만 남은 Eden Space 청소 (Delete)

 

Old Generation

오랫동안 참조가 되어 사용되고 있고, 앞으로도 계속 사용될 확률이 높은 Object 들을 저장하는 영역

 

- 어플리케이션에서 특정 횟수 이상이 참조되어 기준 Age를 초과한 (성숙한) Object는 Young Generation에서 Old Generation으로 이동한다

- Old Generation 영역이 꽉 차게될 경우 Full(Major) GC를 수행한다 (사용되지 않는 객체를 찾아 메모리 해제, 때에 따라 힙 압축도 함께 진행)

 

Stops the World

GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 상황

(stop the world 발생 시, GC를 수행하지 않는 스레드들은 모두 작업을 멈춘다)

 

 

참고 자료

[책] JVM Performance Optimizing 및 성능분석 사례 (생략된 부분도 있고 말이 좀 어려웠따)

[책] 자바 성능 튜닝 (유튜브 보고서 흐름을 한 번 이해하고서 보니까, 설명들이 좀 읽히더라)

[유튜브] https://www.youtube.com/watch?v=UnaNQgzw4zY (설명을 쉽게 해줘서 초심자들이 보기 좋았다)

 


다음에는 GC의 알고리즘에 대해서 공부해오게따.. to be continued..

특히 full GC 쪽에서 차이가 많이 나는 듯하다 (싱글 스레드 돌리냐, 멀티 스레드 돌려서 백그라운드로 GC하느냐 등드르등)

--> 대강 stops the world 줄이려고 노력하기 위해서 나온 알고리즘같아보였다.