기본 개념을 쉽게 설명하고자 알고리즘을 단순화 했다. 실제 운영 JVM에서 GC가 수행되는 방법은 다르다.
- 초보적인 마크 앤 스위프 알고리즘은 할당됐지만, 아직 회수되지 않은 객체를 가리키는 포인터를 포함한 할당 리스트를 사용한다.
.
)만으로 필드에 엑세스하거나 객체 레퍼런스의 메서드를 호출한다.
JVM 및 유사 소프트웨어 시스템에서 객체 수명은 이원적 분포 양상을 보인다. 거의 대부분의 객체는 아주 짧은 시간만 살아 있지만, 나머지 객체는 기대 수명이 훨씬 길다.
- 결론적으로 가비지 수집은
- 단명 객체를 쉽고 빠르게 수집할 수 있어야 한다.
- 장수 객체와 단명 객체를 완전히 떼어놓아야 한다.
- 핫스팟 가비지 수집 메커니즘
- 객체마다 ‘세대 카운트’를 센다. (객체가 지금까지 무사 통과한 GC 횟수)
- 큰 객체를 제외한 나머지 객체는 에덴 공간에 생성하고 살아남은 객체는 다른 곳으로 옮긴다.
- 장수했다고 판단되는 객체는 별도의 메모리 영역(올드 또는 테뉴어드)에 보관한다.
자바는 손쉽게 스레드를 생성할 수 잇지만 새 스레드는 곧 실행 스택을 의미하고 실행 스택의 각 프레임은 GC 루트의 원천이므로 GC는 더 복잡해진다.
public static void main(String[] args) {
int[] anInt = new int[1];
anInt[0] = 42;
new Thread(() -> anInt[0]++).start();
}