C, C++ 언어는 객체를 생성 후, 프로그래머가 직접 해제 해야 함
⇒ JAVA에서는 JVM(자바 가상 머신)의 Garbage Collection이 자동으로 사용하지 않는 객체 해제
GC를 실행하기 전, stop-the-world 발생
stop-the-world
: GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면 OutOfMemoryError가 발생
⇒ WAS가 다운 될 위험 있음
JVM의 메모리 영영 중 Heap 메모리 영역만 다룸
1) 객체가 Null인 경우 (ex: String s = null)
2) 블럭 코드 실행 종료 후, 블럭 안에서 생성 된 객체
3) 부모 객체가 null인 경우, 포함하는 자식 객체들
모든 객체를 스캔하며, 사용 중인 메모리인지 아닌지 확인
⇒ 많은 시간을 소모함 (비효율적)
참조되는 객체 : 파란색, 참조되지 않은 객체 : 주황색
JVM의 heap 영역은 처음 설계될 때 Weak Generational Hypothesis의 두가지 전제로 설계 됨
1) 대부분의 객체는 금방 접근 불가능 한 상태가 됨
2) 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재 함
⇒ 즉, 객체는 대부분 일회성이며 메모리에 오래 남아 있는 경우는 드물다는 뜻
따라서, 객체의 생존기간에 따라 heap 영역을 young, old, perm 영역으로 나눔
1) 새로 생성 된 객체 Eden 영역에 할당
2) Eden영역이 꽉차면 Minor GC 실행
2-1) Eden영역에서 사용되지 않는 객체 메모리 해제
2-2) Eden영역에서 살아남은 객체는 1개의 survivor영역으로 이동시킴
3) (1)~(2) 과정 반복
4) survivor 영역이 가득차게 되면, survivor 영역의 살아남은 객체를 다른 survivor영역으로 이동시킴
⇒ Age값 증가
이때, 한 개의 survivor 영역은 반드시 빈 상태가 됨
5) Age값이 특정 값 이상되면, 특정 age이상이 된 객체들을 old 영역으로 이동
6) (1)~(5)의 과정을 거쳐, old 영역이 가득 찰 때 major GC 발생
참고 블로그 : https://smjeon.dev/etc/jvm-gc/