dev_dbdb1114

[JAVA] 가비지컬렉터 - Heap 영역 본문

프로그래밍/JAVA

[JAVA] 가비지컬렉터 - Heap 영역

dbdb1114 2022. 12. 8. 13:07

GC가비지 컬렉터의 종류

- 가비지 컬렉터는 두 가지가 있다. MinorGC 와 MajorGC 이 두 가지는 왜 나눠졌을까? 

 

GC가 처리하는 메모리 영역 (HEAP)

- 가비지 컬렉터는 쉽게 이해하자면, 쓰지 않는 객체를 메모리 효율을 위해서 비워주는 것인데 해당하는 영역이 HEAP이다. 

- HEAP의 경우도 두 가지 영역으로 나뉜다. Young Generation 과 Old Generation이 그것이다. 그렇기 때문에 가비지 컬렉터의 종류는 두 가지라 볼 수 있다. (MinorGc, MajorGc)

HEAP은 왜 두 개로 나뉘었을까 ( HEAP의 설계 배경 )

- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다. <?>

- 오래된 객체에서 새로운 객체로의 참조는 아주 적다 <?>

==> 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다. 

==> 생존기간에 따른 물리적인 HEAP영역의 분리가 필요하다. 

 

그렇게 나오게 된 Young 영역과 Old 영역

Heap 영역에는 객체가 올라가게 된다. 

Young과 Old로 나눠서 분리된다. 

 

이름만 봐도 알겠지만

Young에는 일회성 객체들이 올라간다. 

Old에는 다회용성 객체들이 올라간다. 

==> Old 영역의 크기가 더 커야한다. 

기준은 뭘까? 크다 / 작다는 너무 애매하다

 

추론

객체들의 관계를 생각해본다면, 서로 참조하는 관계를 많이 가지고 있다. 

Young 영역의 객체들은 아마 GC가 처리할 일이 더 많을 것인데 (일회성 객체가 올라가니까)

만약, Old 영역의 객체가 Young 영역의 객체를 참조하고 있는데 GC가 처리하면 안된다. 

효율적인 방법으로 참조되는 Young영역의 객체를 걸러줘야한다. 

 

매번 Old 영역을 검사하여 참조되는 Young 영역을 기록해서 해당 영역을 제외하고 처리할 수도 있겠다. 

하지만 이렇게 했을 때 큰 객체 위주로 올라가는 Old 영역을 매번 검사해야할 것인데 이는 낭비다. 

그래서 만들어진 것이 카드 테이블이다.

 

*카드 테이블 : Old 영역에 있는 객체가 Young 영역의 객체를 참조할 때 마다 그에 대한 정보가 표시된다. 카드 테이블만 조회하여 GC의 대상인지 식별할 수 있다.

 

Young 영역

새롭게 생성된 객체가 할당(Allocation)되는 영역

대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.

Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 MinorGC라고 부른다.

Old 영역

Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역

Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.

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

 

Comments