🤚 Garbage
- 정리되지 않은 메모리 (주소를 잃어버려서 사용할 수 없는 메모리)
- 유효하지 않은 메모리 주소
- 앞으로 사용하지 않고 메모리를 가지고 있는 객체
프로그래밍 언어에서는 Danling Object, 자바에서는 Garbage라고 부른다
예시
String[] array = new String[2];
array[0] = '0';
array[1] = '1';
array = new String[] {'G', 'C' };
할당한 0과 1은 String 배열이 할당되어 주소를 잃어버린 Garbage 이다.
🤚 Garbage Collector
- 메모리가 부족할때 Garbage를 메모리에서 해제시켜 다른 용도로 사용할 수 있게 해주는 프로그램이다.
- Java에서 객체가 생성되면 해당 객체는 JVM의 Heap 영역의 메모리를 점유한다. 해당 객체가 현재 참조되지 않더라도 메모리 공간을 점유한다. 객체가 점유한 공간을 JVM에서 자동으로 정리하는 역할의 프로세스이다.
- Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제(System.gc() 메서드를 호출)하지 않기 때문에 GC가 더 이상 필요 없는 (Garbage) 객체를 찾아 지우는 작업을 한다
🤚 stop-the-world
- GC를 실행하기 위해 JVM이 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드를 멈추고 GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다.
- stop-the-world 시간을 줄이는
GC 튜닝
을 하기도 한다.
🤚 weak generational hypothesis : GC가 만들어지게 된 두가지 가설(전제 조건)
- 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다
weak generational hypothesis 가설의 장점을 최대한 살리기 위해서 HotSpot VM에서는 크게 2개로 물리적 공간을 나누었다.
🤚 HotSpotVM의 나뉘어진 2개의 물리적 공간
⭐ Young 영역 (Young Generation 영역)
- 새롭게 생성한 객체가 위치해 있는 영역이다.
- 대부분의 객체가 근방 접근 불가능한 상태가 되기에 많은 객체가 Young 영역에 생성되었다가 사라진다.
👉 Young 영역에서 객체가 사라질 때
Minor GC
가 발생한다고 말한다.
⭐ Old 영역 (Old Generation 영역)
- 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 Old 영역에 복사된다.
- 대부분 Young 영역보다 크게 할당하기 때문에 Young 영역보다 GC는 적게 발생한다.
👉 Old 영역에서 객체가 사라질 때
Major GC(Full GC)
가 발생한다고 말한다.
🤚 Perm 영역 (Permanent Generation 영역)
- 객체나 억류(intern)된 문자열 정보를 저장하는 곳이다.
- 이름 뜻 그대로 Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다.
👉 Permanent Generation 영역에서 GC가 발생하면
Major GC
의 횟수에 포함된다.
✍ 카드 테이블(Card Table)
- Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우, 카드 테이블에 정보가 표시된다.
- Minor GC를 빠르게 할 수 있도록 하는 장치인
write barrier
을 사용하여 카드 테이블을 관리한다. (약간의 오버헤드는 발생하지만, 전체적인 GC시간이 줄어든다)👉 Young 영역의 GC를 실행할 때, 이 카드 테이블만 뒤져서 GC 대상인지 식별한다 (Old 영역에 있는 모든 객체의 참조를 확인하지 않는다.)