자바 GC(Garbage Collection)

2024. 6. 13. 21:25Java

이번엔 지난글에서 공부하겠다한 GC를 공부해볼것이다.

GC는 지난글에서 아주 간단히 설명했지만 힙영역에 존재하는 인스턴스가 더 이상 참조되지 않을때 메모리에서 청소된다 했는데 작동원리가 된다.

그러면 GC는 우리가 어떻게 작동하는지 알 필요 없을정도로 만능일까? 아쉽게도 그건 아니었다.

메모리가 언제 해재되는지 정확히 알 수 없고 GC가 동작하는 동안에는 다른 동작이 멈추기 때문에 오버헤드가 발생한다.
(오버헤드는 GC 작업이 애플리케이션 실행에 미치는 부가적인 비용을 의미한다.) 이렇게 동작이 멈추는 현상을 STW(Stop The World)라고 한다.

GC가 작동하는 동안 GC 관련 스레드를 제외한 다른 모든 스레드들은 멈추게 된다.

최적화를 통해 이 STW 시간을 줄이는게 중요하다. 그러한 최적화 작업을 GC 튜닝이라 한다.

우선 튜닝은 튜닝인데 튜닝을 할라면 어떻게 작동하는지를 알아야 한다.

 

객체가 참고되고 있으면 Reachable 참고 되고 있지 않다면 Unreachable로 대상을 구분한다.

즉 Unreachable 이면 GC의 청소 대상이다.

 

- Mark And Sweep

GC 청소방식중 하나이다. 마크 앤 스윕을 알기 위해서는 먼저 GC Root라는걸 알아야 한다. GC Root는 힙 외부에서 접근할 수 있는 변수나 오브젝트다. 즉 거창할거 없이 GC의 시작점이란거다. 과정은 굉장히 간단하다. GC Root에서 출발해서 접근할 수 있는 Reachable객체들을 Mark한다 그후 접근할 수 없어 마크하지 못한 Unreachable들을 Sweep한다. 아래 이미지를 보면 이해가 쉬울 것이다.

 

GC의 청소방식은 알아봤고 다음은 GC의 동작과정을 알아보자 동작과정을 알기 위해선 약한세대 가설을 먼저 알아야한다.

 

- 약한 세대 가설 (weak generational hypothesis)
기본적으로 GC는 이 가설을 기반으로 작동한다. 약한세대 가설은 대부분의 객체는 짧은 생명주기를 가지며 대부분 GC에 의해 청소될 것이라는 가설이다.

 

이러한 특성을 이용해 메모리를 효율적으로 관리하기위해 객체의 생존기간에 따라 힙영역을 물리적으로 Young, Old로 나누었다.

 

어려울것 없이 Young Generation은 짧게 살아남는 객체들이 존재하는 공간, Old Generation은 오래 살아남는 객체들이 존재하는 공간이다. 

 

- Young Generation

새롭게 생성된 객체가 할당 되는 영역이고 대부분의 객체는 약한 세대 가설에 의해 금방 Unreachable이 되기 때문에 이곳에 생성되었다 사라진다.

이 영역에 대한 GC를 Minor GC라한다.

그림처럼 Young Generation은 크기가 Old Genration에 비해 작기 때문에 객체를 찾아 청소하는데 시간이 적게 든다.

그런데 왜 Young 영역은 Old 영역보다 크기가 작을까? 어쩌피 수명이 짧기 때문에 공간이 클 필요가 없기 때문이다.

 

-Old Generation

Young 영역에서 오래 살아남아 이곳으로 복사 된다.

이 영역에 대한 GC를 Major GC라 한다.

 

이렇게 간단히 힙을 나누면 아주 공부하기 쉬워서 좋겠지만 아쉽게도 Young Generation을 또 다시 나눈다.

Young 영역을 Eden, Survivor 공간으로 나눈다.

 

1. 처음으로 생성된 객체는 Eden 영역에 할당된다.

2. 객체가 계속 생성되어 Eden 영역이 가득차면 Minor GC가 실행된다. 여기서 Mark 까지만 한다.

3.  Reachable상태 객체는 Surviovor 영역으로 이동한다. 이때 객체의 age가 증가한다.

4. Mark 되지 않은 Unreachable 객체는 에덴에서 청소된다.

5. 이후 위의 동작을 반복해서 다시 에덴이 가득차면 Minor GC가 실행되고 Survivor0 에있던 객체들이
Survivor1로 이동한다. 물론 Survivor0 에서 마크되지 못한애들은 청소된다.

 

6. Survivor1 에서도 위와 같은 방식을 반복하며 0 -> 1 -> 0으로 이동하면서 객체의 age가 증가한다.

7. 위의 과정을 반복하다 특정 age에 도달한 객체는 Old Generation으로 이동한다. 이 과정을 promotion 이라 한다.

8. Old Generation이 가득차 공간이 부족해지면 Major GC가 발생한다. 이때 Major GC는 Minor GC보다 시간이 오래걸리기 때문에 STW문제가 발생한다.

 

이제 GC의 청소방식과 동작과정을 알았으니 STW를 줄이기 위해 만들어진 GC의 종류에 대해 알아보자

 

- Serial GC

GC를 처리하는 쓰레드가 1개이다.

다른 GC에 비해 STW 시간이 길다.

Mark-Compact 알고리즘을 사용한다. (Mark and Sweep과 달리 객체들을 재배치하는 방식이다)

 

- Parallel GC

Java 8의 default GC이다.

Serial GC와 기본적으로 알고리즘은 같지만 Young 영역을 멀티쓰레드로 수행한다 (Old 영역은 싱글 스레드)

Serial GC에 비해 STW 시간이 감소했다.

 

- Paraller Old GC 

Parallel GC를 개선했다.

Young, Old 모두 멀티 스레드로 수행한다.

새로운 청소 방식인 Mark Summary Compact 방식을 이용했다. (Old도 멀티스레드로 수행하게함)

 

- CMS GC (Concurrent Mark Sweep)

애플리케이션의 스레드와 GC 스레드가 동시에 실행돼 STW 시간을 최대한 줄이기 위해 고안됐다.

단 GC 과정이 매우 복잡해서 다른 GC 대비 CPU 사용량이 높고, 메모리 파편화 문제가 있다.

(메모리 파편화는 Sweeping 과정에서 메모리를 해제할때 메모리가 파편화 되어 여러 곳에 흩어져 있어 큰 공간의 메모리를 사용할 수 없다는 것이다. 즉 공간을 효율적으로 사용하지 못해 효율성이 저하된다.)

CMS GC는 Java 9 버전에서 deprecated 됐고 Java 14에서는 사용이 중지됐다.

 

- G1 GC (Garbage First)

CMS GC를 대체하기 위해 jdk 7 버전에서 최초로 release됐다.

Java 9+ 버전의 default GC로 지정됐다.

기존의 GC는 힙을 고정적으로 Young/ Old 영역으로 나누었지만 G1 GC는 Region이라는 영역으로 가변적으로 상황에 따라 Eden, Survivor, Old등으로 영역을 나눴다.

가득찬 영역을 빠르게 회수해 빈 공간을 확보해 GC 빈도가 줄어든다.

 

 

- 참고문헌

 

☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객

inpa.tistory.com

 

 

Garbage Collection, GC, 가비지 컬렉션, 개념, 동작원리, 알고리즘

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

flightsim.tistory.com

 

 

가비지 컬렉터(Garbage Collector)와 Mark & Sweep

이번 포스트에서는 JVM(Java Virtual Machine)의 메모리 관리방법에 대해서 약간 설명하도록 한다. JVM의 메모리 관리방법을 알기 위해서는 JVM이 무엇인지에 대해 먼저 알아야한다. 따라서 JVM에 대해 간

imasoftwareengineer.tistory.com

 

 

Exploring the Inner Workings of Garbage Collection in Golang : Tricolor Mark and Sweep

Connect me on LinkedIn 🤝 to craft scalable systems

medium.com

 

 

JVM에서 Garbage Collection(GC) 이 일어나는 방식 알아보기

JVM에서 Garbage Collection이 중요한 이유 JVM은 자동으로 메모리를 관리해주기 때문에 GC(Garbage Collection)가 성능상 매우 중요하다. 모든 머신들이 그렇듯 JVM 또한 사용되지 않는 객체들이 제때 메모리

kotlinworld.com

 

 

가비지 컬렉션(GC)의 원리와 종류

1. 가비지 컬렉션? JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스 (참고) JVM의 메모리 구조 메소드 영역 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와

jonny-cho.github.io

 

'Java' 카테고리의 다른 글

불변객체 VS 가변객체  (0) 2024.06.15
자바 메모리 구조  (0) 2024.06.09
싱글톤 패턴 (Singleton Pattern)  (0) 2024.06.07