개발/자바

자바 gc 약한 세대 가설 (weak generational hypothesis)

브로리카 2021. 7. 8. 01:47

가비지 컬렉터의 역할

1. 메모리 할당

2. 참조된 객체가 메모리에 남아있는지 확인

3. 런타임 때 더 이상 도달할 수 없는 개체의 메모리 회수

 

가비지 컬렉터가 실행되는 상황

1. 전체 힙 또는 하위 요소가 임계값 이상이 될 때2. 요청한 메모리만큼 힙에서 할당할 수 없는 경우

 

 Compaction

가비지 컬렉터가 실행되고 난 후에는 여유 공간들이 연속돼있지 않고, 여러 chunk로 남는다.

이는 큰 개체에 대한 할당을 어렵게 만들기 때문에 가비지 컬렉터는 다양한 압축 방법을 지원한다.

 

가비지 컬렉터의 성능 지표

1. 처리량(Throughput) : 충분히 긴 시간동안 가비지 콜렉터 수행 시간을 제외한 런타임 비율

2. overhead : 1번의 반대. 가비지 컬렉터의 수행 시간 비율

3. pause time : 가비지 컬렉션이 일어나는 동안 실행이 멈추는 시간.

4. Frequency of collection : 가비지 컬렉션이 얼마나 자주 일어나는지.

5. Footprint : heap 크기

6. Promptness : 개체가 garbage가 되고 해당 개체의 공간이 사용 가능해지기 까지의 시간

 

약한 세대 가설(weak generational hypothesis)

 

가비지 컬렉션은 에이징과 함께 세대별 청소를 사용해 힙 영역의 공간을 최대한 확보
(Use generational scavenging in conjunction with aging to concentrate their efforts on areas in the heap that most likely contain a lot of reclaimable memory areas.)

 

root set으로부터 접근 불가능한 모든 object들은 쓰레기로 간주돼 가비지 컬렉터에 의해 수집된다.하지만 가비지 컬렉션이 수행될 때마다 하나하나 추적하는건 부하가 너무 큰 일이다.

 

하지만, 대부분의 응용프로그램에서 아래 그래프를 통해

대부분의 object들이 짧은 시간동안만 살아있단 것을 확인.

이를 약한 세대 가설(weak generational hypothesis)이라고 한다.

 

 

출처 : oracle docs 클릭하시면 원글을 볼 수 있습니다.

 

대부분의 응용 프로그램들의 object 수명을 나타낸 그래프.

x 축은 측정된 object의 lifetime을 보여준다.

y축은 lifetime이 있는 개체의 총 Byte이다.

이 결과를 통해 대부분의 object들은 생성되지 얼마 안 가 소멸된다는 것을 알 수 있다.

 

메모리 구조

위에서 약한 세대 가설을 최적화하기 위해 java의 메모리는 아래와 같이 세대 단위로 관리된다.

 

출처 : oracle docs

 

어떤 세대의 메모리 풀이 가득 찬다면 해당 세대에서만 가비지 컬렉션이 실행된다.

이 가비지 컬렉션도 세대에 따라 2가지로 나뉘는데

Young Objects는 Minor collection

Old Objects는 Major collection

이라고 부른다.

 

가비지 컬렉션이 수행된 후 남은 Objects들은 메모리의 오른쪽 (Old Generation)으로 이동한다.

이것을 promoted 또는 tenured라고 한다.

 

Young Generation은 빨리 모이기 때문에 여기에 관한 가비지 컬렉션 알고리즘들은 주로 속도를 중시한다.

반면, Old Genration관련 알고리즘들은 공간 효율을 중시한다.
왜냐하면 대부분 Old Generation은 힙의 대다수 부분을 차지하기 때문이다.

 

commit vs virtual

이 commit과 virtual 공간은 조절이 가능

 

HotSpot Generations

Young, Old 2개의 세대에서 Permanent Generation이 추가돼 총 3개의 Generation이 있음.

Old에서 살아남은 개체가 이쪽으로 넘어가는게 아니라

JVM이 가비지 컬렉션을 사용하는데 편리하다고 생각한 class와 method개체들을 가지고 있다.

 

young Genreation은 Eden과 2개의 작은 survivor공간으로 나눠졋다.

Eden은 YG처럼 초기 할당되는 구역이다. 하지만 공간이 충분하지 않은 경우, OG에 할당되기도 한다.

 

survivor 공간은 최소한 하나의 YG에서 살아남은 개체가 OG로 가기 전에 다시 한 번 테스트하는 공간이다.

 

 

 

 

참고
https://docs.oracle.com/en/java/javase/16/gctuning/garbage-collector-implementation.html#GUID-C2CA24AD-DC01-4B31-A868-F7DAC7E3BF4D

 

HotSpot Virtual Machine Garbage Collection Tuning Guide

One strength of the Java SE platform is that it shields the developer from the complexity of memory allocation and garbage collection.

docs.oracle.com

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