hong's android

[Java] Garbage Collector 본문

Develop/Java

[Java] Garbage Collector

_hong 2023. 1. 2. 21:31

Garbage Collector

 

Gc의 수거대상

Gc root로부터 참조를 탐색했을 때, unreachable 한 객체

 

Gc root

1) 스택 영역의 데이터들

2) 메소드 영역의 데이터들

3) JNI에 의해 생성된 객체들

 

*JNI : os에 종속적인 프로그램을 실행시키기 위한 프레임 워크 또는 c, c++ 등 다른 언어로 작성된 라이브러리를 호출하거나 반대로 호출되는 것을 가능하게 해주는 프레임워크

 

Gc가 언제 일어날까?

Heap 구조

위와 같이 새로운 객체들은 Young Generation 영역에, 만든지 비교적 오래된 객체들은 Old Generation에 저장한다.

 

일반적인 Gc 동작

Minor Gc

Young Generation에서 일어나는 Gc, Eden 영역이 가득 차면 발생한다.

 

1. 새로운 객체가 만들어지면 Eden 영역에 객체가 저장된다. 

2.객체가 계속 만들어지고 eden 영역이 가득 차게 되면 Mark and Sweep 과정이 일어나게 된다,

3. 이때 살아남은 객체들은 Survivor Space에 저장이 되는데 S0에 저장된다.

4. 객체가 생성되면 다시 eden 영역에 저장되고 가득 차면 Mark and Sweep 과정이 발생한다.

5. 위 과정에서 살아남은 객체들은 S1에 저장되고 S0에 저장되어 있던 객체들도 S1로 복사해 준다.  

6.S0 -> S1로 복사될때 객체의 age 값 증가 (일정 임계치가 넘으면 Old Generation으로 옮겨진다.)

 

Major Gc or Full gc

Old Generation에서 일어나는 Gc, old 영역이 가득 차면 발생한다.

1. old 영역에 존재하는 unreachable한 객체들을 mark 한다.

2. mark 된 객체들을 제거한다.

 

Young Generation + Old Generation 왜 필요할까?

Young Generation에서 작동하는 Minor Gc와 Old Generation에서 작동하는 Major Gc가 함께 있어서 더 효율적이게 Gc를 수행하고 메모리를 확보할 수 있다. Young Generation은  Old Generation보다 크기가 작기 때문에  Major Gc보다 Minor Gc가 더 빠르고 비용이 덜 든다.(메모리 상의 객체를 찾아 제거하는 작업) 최대한 잠깐 존재하는 객체들은 메모리에서 제거해주어야 공간이 확보되기 때문에 Young Generation이 따로 존재한다. Young Generation 영역은 오래 남을 객체를 저장하게 된다면 공간이 부족하다 그렇기 때문에 Old Generation이라는 영역이 따로 필요하다.

대부분의 객체들은 생성 후 금방 사라지기 때문에 Minor Gc의 쓰레기 객체 수거율이 높다. 

 

Gc 종류

* Stop the world : Gc가 발생하기 위해서 다른 스레드 작업들을 중단시키는것

 

1.Serial Gc

스레드 한 개 사용해서 gc처리, 메모리가 적고 대기 시간이 많아도 되는 프로그램에서 사용하면 좋음

Mark-summary-compact 알고리즘을 사용

 

2.Parallel Gc

Minor Gc를 멀티 스레드를 사용해서 처리, Gc를 Serial Gc보다 빠르게 처리해서 대기 시간이 줄어든다,.

Mark-summary-compact 알고리즘을 사용

 

3.Parallel Old GC

Minor Gc + Major Gc를 함께 멀티 스레드를 사용해서 처리

Mark-summary-compact 알고리즘을 사용

 

그럼에도 애플리케이션 지연 문제가 발생한다.

 

4.CMS (Concurrent Mark Sweep) GC

Stw를 줄이기 위해서 탄생했다.  Stw를 줄이기 위해서 Compaction 작업도 하지 않아 메모리 단편화 문제가 있다.

애플리케이션 스레드+ gc 스레드를 함께 사용하고, gc과정을 쪼개어하면서 Stw시간을 줄인다.

Old 영역에서만 적용된다.

 

1) Gc root와 근접한 객체들 중 살아있는 객체들을 마킹한다. Stw가 짧다. (Stw)

2) 1에서 마킹한 객체들이 참조하는 객체들을 추적한다. 애플리케이션 스레드와 함께 실행한다.

3) 2를 수행하는 도중에 참조 관계가 바뀐 객체들을 다시 마킹한다. (Stw)

4) 표시한 객체들을 삭제하는 단계

 

단점 : cpu, 메모리 사용량이 많음, compact 작업을 하지 않아서 메모리 단편화가 일어난다.

 

*메모리 단편화 : 사용할 메모리는 충분하지만 할당을 할 수 없음.

 

5.G1 Gc

물리적으로 힙 영역을 3 영역으로 나누는 대신 힙 영역을 수많은 작은 영역으로 쪼갠다.

큰 heap 메모리를 사용할 때 효율적이다. Heap 영역을 여러 region으로 나누고 필요한 부분만 gc를 처리한다. 그렇기 때문에 모든 gc를 처리하기 위해 모든 heap 영역을 확인해야 하지 않고 gc를 해야 하는 부분이 많은 region들만 우선적으로 처리한다.

CMS와 달리 Compaction 단계를 진행한다.

 

Young Generation에서의 Gc

Old Generation 에서의 Gc

1) survival 영역에서 old영역을 참조하고 있는 영역들을 마킹.

2) surviva 영역에 대한 Gc 대상 식별.

3) 힙 내 모든 old 영역에 대한 Gc 대상을 식별

4) 모든 객체가 garbage인 영역을 제거

5) live object 비율이 가장 낮은 영역 순으로 수거, live object들은 다른 영역으론 이동시킨다.

 

여유 메모리가 필요하다면 거의 다 찬 영역들만 gc를 진행하면 되기 때문에 효율적이다.

단점 : 힙 영역이 너무 작은 경우 좋은 성능을 발휘하지 못한다.

 

 

 

 

Reference.

https://jonny-cho.github.io/java/2021/06/01/garbage-collection/

 

가비지 컬렉션(GC)의 원리와 종류 · 개발의숲

가비지 컬렉션(GC)의 원리와 종류 01 Jun 2021 | garbage collection gc 1. 가비지 컬렉션? JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스 (참고) JVM의 메모리 구조 메소드 영역 클래스 멤버 변

jonny-cho.github.io

 

https://middleearth.tistory.com/87

 

자바의 G1 GC의 원리에 대해 알아보자

본 게시물은 해당 블로그에서 레퍼런스를 번역한 자료임을 알립니다. 퍼가실때 해당 블로그의 주소는 밝히실 필요가 없으나 레퍼런스의 주소는 밝혀주시면 감사하겠습니다. 자바 9 버전 이후부

middleearth.tistory.com

 

https://lazymankook.tistory.com/83

 

Garbage Collection (Hotspot JVM GC)

개요 Garbage Collector(GC)는 Heap 메모리에서 참조되지 않는 객체를 식별하여 메모리에서 삭제하는 기능이다. JVM은 GC를 수행하기 아래의 과정을 거친다. GC Steps Marking 메모리 중 어떤 부분이 사용되지

lazymankook.tistory.com

 

 

 

 

'Develop > Java' 카테고리의 다른 글

[Java] Synchronized  (1) 2023.02.11
[Java] 리플렉션  (0) 2023.01.16
[Java] 자바 정리  (0) 2022.12.31
[Java] Map 인터페이스  (0) 2022.12.31
[Java] 자바와 Jvm에 대해서  (0) 2022.12.26