본문 바로가기
Knowledge/CS

[CS] 가비지 컬렉션(Garbage Collection, GC) 이란?

by YoonJong 2022. 12. 24.
728x90

가비지 컬렉션이란?

가비지(Garbage) 는 유효하지 않는 메모리를 뜻한다.

JVM 의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요없게 된 메모리 영역을 주기적으로 삭제하는 프로세스

 

장점 : 개발자 입장에서는 메모리 관리 관련해서 신경을쓰지 않고 개발에만 집중할 수 있다.

단점 : 메모리가 언제 해제되는지 정확히 알 수 없다. /  GC가 동작하는 동안 다른 동작이 멈춘다.

 

C언어는 free() 라는 함수를 통해 메모리를 해제해주어야 하지만, Java 에서는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문에 따로 해제하는 일이 없다.

대신 불필요한 데이터를 표한하기 위해서는 null로 선언을 해준다.

 

JVM 의 heap 영역은처음 설계될 때 다음의 2가지 전제로 설계되었다고 한다.

 1. 대부분의 객체는 금방 접근 불가능한 상태가 된다.

 2. 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.

 

정리하면, 객체의 대부분은 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다는 것이다.

때문에, 물리적인 heap 영역을 나누게 되었으며, Young 영역(Minor GC) 과 Old 영역(Major GC) 으로 설계되었다.

 

 

Young 영역

 - 새롭게 생성된 객체가 할당 되는 영역

 - 대부분의 객체가 금방 접근 불가능한 상태가 되기 때문에, 많은 객체가 Young 영역에서 생성되고 사라진다.

 - Minor GC 라고도 부른다.

 

Old 영역

 - Young 영역에서 접근 가능한 상태를 유지하여 살아남은 객체가 복사되는 영역

 - Young 영역보다 크게 할당되며, 가비지는 더 적게 발생한다.

 - Major GC 또는 Full GC 라고도 부른다.

 

Young 영역의 크기가 더 작은 이유는 수명이 짧은 객체들이 많기 때문에 생성,삭제를 반복하기 때문이다.

Old 영역의 객체들은 더욱 크기가 크다.

 

 

Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우가 있다.

이런 경우를 대비해서 Old 영역에는 카드테이블(Card Table)이 존재한다.

 

카드 테이블이 있는 존재하는 이유는 Old 영역에서 Young 영역의 참조하는 객체를 찾을 때,

Young 테이블을 모두 조회하는 것은 비효율적이므로, 카드테이블에 있는 참조값만 찾아 식별한다는 것이다.

 


가비지 컬렉션의 동작방식

가비지 컬렉션의 Young 영역과 Old 영역의 세부적인 동작 방식은 다르지만, 

기본적으로 카비지컬렉션이 동작한다면 공통의 단계를 진행하게 된다.

 

1. Stop the World

 - 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업이다.

 - GC가 실행될 때, GC를 실행하는 스레드를 제외한 모든 스레드의 작업이 중단된다.

 

2. Mark and Sweep

 - Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업

 - Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

 

 Mark 작업으로 사용되고 있는 메모리를 식별하고, 해당 작업을 거쳐서

 Sweep 작업을 통해 Mark 되지 않은 객체들을 메모리에서 제거한다.

 

 

Young GC ( Minor GC )  의 동작방식

  Young 영역은 Edan 영역과 2개의 Survivor 영역이 있다.

  

Edan 영역 : 새로 생성된 객체가 할당되는 영역

Survivor 영역 : 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역

 

1. 객체가 생성되면 Edan 영역에 생성된다.

2. Edan 영역이 꽉 차면 사용되지 않은 메모리는 해제되고, 남은 객체들은 1개의 Survivor 영역으로 옮겨진다.

3. 1개의 Survivor 영역이 가득차면 다른 Survivor 영역으로 이동한다.

4. 이런 과정을 계속하면서 살아남은 객체는 Old 영역으로 이동하게 된다.

 

객체가 얼마나 생존했는지 확인하기 위한 단위인 age를 Object Header에 기록한다.

age를 보고 Old 영역으로 이동할지 결정한다.


추가적으로, 2개의 Survivor영역에 모두 데이터가 존재하거나, 모두 사용량이 없다면 정상적인 시스템이 아니다.

 

 

JVM 에서 Edan 영역에 객체를 빠르게 할당하기 위해 2가지 기술을 사용하고 있다.

 

1. bump the pointer

 - Eden 영역에 마지막으로 할당된 객체의 주소를 캐싱하는 것.

 마지막 주소의 다음 주소를 사용하게 됨으로써 속도를 높일 수 있다.

 

2. TLABs(Thread - Local Allocation Buffers)

 - 각각의 스레드마다 Edan 영역에 객체를 할당하기 위한 주소를 부여해서, 동기화 작업 없이 빠르게 메로리를 할당하는 기술

 멀티스레드 환경이라면, 락(Lock)을 걸어 동기화를 해주어야 한다.

 

 

Old GC ( MajorGC )  의 동작방식

Old 영역의 객체들이 이동되어 Old 영역의 메모리가 부족해지면 발생한다.

Old 영역은 Young 영역보다 크며 시간이 오래걸리는 특징이 있다.

 

 

 

 

참고 블로그

https://mangkyu.tistory.com/118

 

[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)

1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는..

mangkyu.tistory.com

https://coding-factory.tistory.com/829

 

[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리

 가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로

coding-factory.tistory.com

 

728x90

'Knowledge > CS' 카테고리의 다른 글

[CS] 처리량과 지연시간  (0) 2022.12.30
[CS] 로드 밸런싱(Load Balancing)  (0) 2022.12.27
[CS] 인터럽트란?  (0) 2022.12.22
[CS] JVM 이란?  (0) 2022.12.17
[CS] Spring MVC 이란?  (0) 2022.12.16

댓글