[F-Lab 모각코 챌린지] 32일차 - ZGC 공부 + 참조
F-Lab 모각코 챌린지 32일차 정리 입니다 ZGC 이론 중 Reference Coloring 과 Load Barrier, Slow path 에 대해 공부 하였으며, 추가로 이전 글에서 몰랐던 키워드를 정리했습니다. (약한 참조, 소프트 참조, 팬텀 참조)
![[F-Lab 모각코 챌린지] 32일차 - ZGC 공부 + 참조](/content/images/size/w1200/2023/06/---_---_----1.png)
ZGC 의 목표
ZGC 는 아래의 목표를 충족하도록 설계된 저지연 가비지 컬렉터
- 밀리초 미만의 최대 중지(Stop the world) 시간
- 중지(Stop the world) 시간은 힙, 라이브셋 또는 루트셋 크기에 따라 증가하지 않는다
- 크기가 8MB ~ 16TB 의 힙 처리를 지원
Reference Coloring
ZGC 가 가비지 컬렉션을 효율적으로 수행하기 위해 힙 메모리 참조에 추가적인 메타 데이터를 저장하는 기술
일반적으로 많은 컴퓨터는 64비트 시스템을 사용하지만, 현재 하드웨어는 가상 메모리 주소를 위해 참조를 48비트로 제한한다. 실제로는 47 비트만 사용하며 마지막 bit 는 언제나 0 이다.
![](https://blog.pollra.com/content/images/2023/06/image-6.png)
실제 객체 주소는 처음 42비트를 사용한다. (이로서 최대 4TB 용량을 가질 수 있다)
나머지 비트(위 이미지에서 45~42bit)는 플래그 (finalizable, remapped, marked1, marked0) 에 사용
- finalizable: 객체는 오직 finalizer 로만 접근 할 수 있다
- remapped: 해당 참조는 최신상태이며 객체의 현재 위치를 나타낸다
- marked0 & marked1: 접근 가능 객체들을 마킹할 때 사용
Load Barrier
JIT 에 의해 주입된 코드. 애플리케이션 스레드가 힙 메모리에 있는 객체를 참조할 때 만나게 된다.
이 코드는 Reference Coloring 에서 사용하는 meta bits 가 bad color 인지 체크한다.(여기서 bad color 는 객체의 상태가 유효하지 않거나 변경되었을 경우 bad color 라고 판단한다.)
만약 bad color 라면 객체를 상황에 따라 mark/relocation/remapping 수행한다. 이 과정을 slow_path 라고 한다
Slow path
load barrier 나 예외 상황에서 성능 저하가 발생 할 경우를 대비하여 사용되는 개념
(파일 읽기 작업을 수행한다고 했을 때 일반적으로는 fast path 를 통해 파일을 읽어와서 처리한다. 하지만 파일이 해당 경로에 없거나 액세스 권한이 없는 경우 slow path 또는 다른 코드가 수행된다)
이전 글 에서의 모르는 키워드 정리
약한 참조(WeakReference)
자바에 존재하는 클래스 중 하나로 약한 참조를 구현할 때 사용된다
일반적인 참조인 '강한 참조(Strong Reference)' 와 달리 약한 참조는 가비지 컬렉터가 동작 시 언제든 해제될 수 있다.
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
// 원본 객체를 생성
String originalObject = new String("Original Object");
// 약한 참조를 생성
WeakReference<String> weakReference = new WeakReference<>(originalObject);
// 원본 객체에 대한 약한 참조를 통해 객체에 접근
String retrievedObject = weakReference.get();
System.out.println("Retrieved Object: " + retrievedObject);
// 원본 객체에 대한 강한 참조를 제거
originalObject = null;
// 가비지 컬렉션을 수행하여 약한 참조된 객체 수거 명령(실제로 GC 는 실행되지 않으나, 이해를 위해 작성된 코드
System.gc();
// 약한 참조를 통해 객체에 접근
String retrievedAfterGC = weakReference.get();
System.out.println("Retrieved Object after GC: " + retrievedAfterGC);
}
}
위 코드를 실제로 동작 시킬 경우 아래와 같은 결과가 나온다
Retrieved Object: Original Object
Retrieved Object after GC: Original Object
이는 가비지 컬렉션이 개발자의 의도와 다르게 동작하는 경우인데, 정상적인 프로세스의 경우 GC를 만나면 약한 참조는 메모리에서 해제된다.
소프트 참조(Soft references)
Java 에서 객체를 참조하는 방식 중 하나
약한 참조와 비슷하게 GC 에 의해 수거될 수 있는 참조. 하지만 약한 참조와는 달리 메모리 부족 상태일 때에만 수거된다
java.lang.ref.SoftReference
클래스를 통해 약한 참조와 마찬가지로 생성 할 수 있다
팬텀 참조(Phantom references)
가비지 컬렉터가 객체를 수거할 때에만 알림을 받을 수 있는 참조
(수거 알림용으로만 참조하며 팬텀 참조를 통해 실제 객체에 접근할 수는 없다.)
팬텀 참조는 java.lang.ref.PhantomReference
클래스를 사용하여 생성하며 보통은 java.lang.ref.ReferenceQueue
와 함께 사용되어 GC 가 객체를 수거하면 알림을 받을 수 있도록 한다.