: 유효하지 않은(더 이상 불필요한) heap의 객체 메모리를 JVM의 데몬이 정리해주는 것.
- JVM의 GC 예시. C++이나 C에서는
free()
를 통해 직접 할당 해제해줘야 한다. - 위의 그림에서 permanent 영역은 heap에서 제외
GC 설계의 바탕
: 대부분의 객체는 금방 unreachable 상태가 된다.
e.g) 메서드 종료 시 그 메소드에서 생성된 객체는 더이상 사용하지 않는 경우
e.g 2) User user = new User();
과 같이 생성해 DB에 저장하거나 하는 등의 태스크를 수행하고 더이상 객체 자체는 사용이 안되는 경우
GC 동작 방식
Minor, Major GC?
- Young 영역의 각 하위 영역이 가득 차면 Minor GC 발생.
- Old 영역이 가득차면 Major GC(== Full GC) 발생.
Stop the world
: GC를 수행하는 데몬 스레드 외에 모든 스레드 작업 멈추는 상태이다. GC 완료 후 다시 스레드 들이 실행 상태된다. 따라서 당연하게 GC가 자주 수행 될수록 성능은 저하된다. 성능을 위해서라면 GC를 튜닝할 수도 있다.
동작 기법: Mark and Sweap
GC는 객체를 돌면서 각각이 어떤 객체를 참조하고 있는지 reference를 탐색하면서 mark해 참조가 되는 객체와 아닌 것을 체크한다. 이후 Sweap 과정에서는 불필요한 객체를 제거한다.
동작 과정
- 객체 생성 시 YG의 Eden으로 이동한다.
- Eden영역이 꽉차 Minor GC 발생하고, 살아남으면 Survivor 1로 이동한다.
- 이후 Survivor 1, 2 사이를 minor GC 발생에서 살아남을때마다 번갈아가며 이동한다.
- Minor GC에서 살아남은 횟수(age bit)가 지정해놓은 임계값을 넘게 되면, Old 영역으로 이동한다.
- Old 영역의 객체는 MajorGC때 참조 여부에 따라 살아남거나 제거된다.
G1(Garbage first) GC
- java에서 사용되는 GC
- 멀티 쓰레드로 Stop the world가 동작
Region 개념 도입
- 힙을 균등하게 region으로 나누고, 가비지가 많은 region에 우선적으로 GC
- Minor - Eden에 많다 싶으면 해당 지역 GC 하고, 살아남은 객체 다른 영역 이동. 복제되는 지역이 Available / Unused면 해당 영역은 Survivor이 되고, Eden이었던 곳은 Available/Unused 된다.
Major - GC가 많은 지역을 조합해 해당 지역에 GC 수행
- 좋은 경우
- Java heap 반 이상이 살아있는 객체일 때
- GC가 너무 오래 걸려 튜닝이 필요할 때
Reference)
https://velog.io/@hygoogi/%EC%9E%90%EB%B0%94-GC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md
https://deveric.tistory.com/64
https://mangkyu.tistory.com/119