DevBoi

Java Garbage Collection 이란? 본문

Language/[Java]

Java Garbage Collection 이란?

HiSmith 2021. 7. 21. 15:46
반응형

자바 가비지 컬렉션의 동작및 개념에 대해서 알아본다.

 

우선 가비지 컬렉션이란?

프로그램을 개발하다가, 유효하지 않은 메모리인 가비지가 발생하게되고

C나 다른 언어는 free를 통해, 직접 메모리를 해제해주어야 하지만,

java 는 가바지컬렉터가 불필요한 메모리를 알아서 정리해준다.

 

Java 에서는 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다는 전제로 설계되었다.

객체의 생존 기간에 따라 물리적인 heap영역을 나누게 되었고, 

이에 따라 Young Old, 총 2가지 영역으로 설계되었다.

 

1. Young 영역 (Young Generation)

새롭게 생성된 객체가 할당되는 지역이다.

대부분으니 객체가 금방 Unreachable(1회성 상태) 가 되기 때문에

많은 객체가 Young영역에 생성되었다가 사라진다.

Young 영역에 대한 가바지 컬렉션을 Minor Gc라고 부른다.

 

2. Old영역 (Old generation)

Young 영역에서 Reachable상태를 유지하며 살아남은 소수의 객체들이 old영역으로 복사

가 된다. 대부분의 영역 보다 크게 할당된다.

Old 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.

 

예외의 상황에서 Old영역에 있는 객체가 Young 영역의 객체를 참조하는 경우도 있다.

Old영역에는 512 의 덩어리로 되어있는 카드 테이블이존재한다.

카드테이블에서는 Old영역에 있는 객체가 Young 영역의 객체 참조할때 필요한 정보가있다.

 

 

2. Garbage Collection 동작과정

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

GC가 실행될때는 GC를 실행하는 쓰레드 외의 모든 쓰레드들의 작업이 중단, GC완료가 되면, 다시 다른 쓰레드들이

동작한다.

이러한 GC 작업때 다른 스레드가 돌지않기때문에, 튜닝을 한다면, 이 때의 타이밍에 대한 시간을 줄인다.

JVM에서도 이러한 문제를 해결하기 위한 옵션을 제공한다. 튜닝 관련 상세 정보는 

추후에 포스팅 예정

 

Minor GC의 동작방식

Young 영역의 구조에 대해 이해를 해야한다.

Young 영역 = 1개의 Eden 영역 + 2개 Survivor 영역

 -Eden 영역, 새로 생성된 객체가 할당되는 지역

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

 

상세 동작 과정

- 새롭게 생성된 객체가 Eden 영역에 할당된다.

- 객체가 계속 생성 되어, Eden 영역이 꽉차고, Minor GC가 실행

( Eden 영역에서 사용되지 않는 객체의 메모리가 해제,
Eden 영역에서 살아남은 객체는 , 1개의 Survivor 영역으로 이동)

 

위의 과정이 반복되다가 Survivor 영역이 가득차게 되면, 살아남은 영역이 

다른 Survivor 영역으로 이동, 또 계속 하다가 가득차면 살아남은 영역이

Old영역으로 이동,

 

Old영역으로 이동될때, 순번은, Minor Gc때, Objectheader에서 기록된 age를 보고 promotion 여부 결정한다.

age는 한번 살아남을때마다, count를한다.

 

Major GC의 동작방식

young 영역은 크기가 작기 떄문에 어플리케이션에 크게 영향을 주지 않지만, Old영역은 young 영역보다

크고, Young 영역을 참조할수도있기때문에, 크기가 크고, GC시간이 Young 보다 훨씬커서

어플리케이션 영향을 줄수 있다.

 

따라서 Minor Gc는 실행속도가 빠르고, Major Gc는 느리다고 할수있다.

 

 

 

 

 

 

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

JAVA stream _ 심화  (0) 2021.09.05
JAVA stream 사용 예제_1  (0) 2021.09.02
Optional 변수 예제 및 사용방법  (0) 2021.07.07
Stream 객체 사용 방법 및 예제  (0) 2021.07.05
제네릭 사용법 예제 쉽게 정리  (0) 2021.06.27