[Java] Garbage Collection

[Java] Garbage Collection

자바에서는 JVM(Java Virtual Machine)이 구성된 JRE(Java Runtime Environment)가 제공되며, 그 구성 요소 중 하나인 Garbage Collection이 사용하지 않는 객체를 자동으로 파괴한다.

GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것을 'stop-the-world'라 한다.

어떤 GC 알고리즘을 사용하더라도 'stop-the-world'가 발생하므로, 대부분 GC 튜닝은 이 시간을 줄이는 것이라고 한다.

Garbage Collection

GC는 JVM에서 수행하며, 사용하지 않는 객체는 메모리에서 삭제한다.

기본적으로 JVM의 메모리는 5가지 영역(class, stack, heap, native method, PC)으로 나뉘는데, GC는 heap만을 다룬다.

다음은 GC의 대상이 되는 경우이다.

객체가 NULL인 경우 부모 객체가 NULL인 경우, 이를 포함하는 자식 객체 블럭 실행 종료 후, 블럭 안에서 생성된 객체

GC는 'Weak Generational Hypothesis'에 기반한다.

GC의 메모리 해제 과정

Marking

프로세스는 마킹을 호출하는데, 이는 GC가 메모리 사용 여부를 찾아내는 것이다.

이를 결정하기 위해 모든 오브젝트가 탐색되므로 매우 많은 시간이 소모된다. Normal Deletion

참조되지 않는 객체를 제거하고, 메모리를 반환한다.

메모리 Allocator는 반환되어 빈 블럭의 참조 위치를 저장해 두었다가, 새로운 오브젝트가 선언되면 할당된다. Compacting

퍼포먼스 향상을 위해, 참조되지 않는 객체를 제거하고 남은 '참조되는 객체'들을 묶어 공간이 생기도록 한다.

-> 새로운 메모리 할당 시 더 쉽고 빠르게 진행할 수 있다.

Generational Garbage Collection

배경: 모든 객체를 Mark & Compact하는 JVM은 비효율적이다.

시간이 갈수록 적은 객체만이 남는다는 것에 기반한 것이 'Weak Generational Hypothesis'이다.

Weak Generational Hypothesis: 새로 생성한 객체의 대부분은 금방 사용하지 않는 상태가 되고, 오래된 객체에서 신규 객체로의 참조는 매우 적게 존재한다는 가설

이 가설에 기반하여 자바는 Young영역 & Old 영역으로 메모리를 분할하고, 신규로 생성되는 객체는 Young 영역에, 오랫동안 살아남은 객체는 Old 영역에 보관한다.

Young 영역

새롭게 생성한 객체의 대부분이 위치한다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다. Eden 영역 Survivor 영역 2개

새롭게 생성한 객체의 대부분이 위치한다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다. Old 영역

Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, Young영역보다 GC가 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC (Full GC)가 발생한다고 말한다.

Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, Young영역보다 GC가 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC (Full GC)가 발생한다고 말한다. Permanent 영역

Method Area라고도 한다. JVM이 클래스들과 메소드들을 설명하기 위해 필요한 meta-data들을 포함한다.

과정

새로운 객체가 들어오면 Eden 영역에 할당한다. Eden 영역에서 GC가 한 번 발행한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다. Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다. 하나의 Survivor 영역이 가득 차면, 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다.

그리고 가득 찬 Survivor 영역은 아무 데이터도 없도록 비운다. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동한다.

(https://d2.naver.com/helloworld/1329)

출처: https://gyoogle.dev/blog/computer-language/Java/Garbage%20Collection.html

from http://gokong.tistory.com/34 by ccl(A) rewrite - 2021-10-11 20:02:03