JVM - Garbage Collection

김태수·2022년 4월 19일
0

JAVA

목록 보기
1/1

JVM

Effective java 책을 학습하던 중 자바의 동작 원리에 대해 자세히 알고 있다면 이해하기 쉬운 내용이 많아 JVM에 대해 정리하려고 합니다.
본 글에서는 Chapter1 '객체의 생성과 파괴'에서 JVM의 가비지 컬렉션 (Gabage Collection, 이하 GC)에 대한 내용이 자주 언급되어 GC에 대해서 정리하는 글을 쓰고자 합니다.

Gabage Collection

Java에서 개발자는 특별한 경우가 아니라면 할당한 메모리에 대해서 따로 관리할 필요가 없습니다. C, C++에서는 개발자가 동적 메모리에 대해 관리하기 위해 malloc(), free()와 같은 함수를 사용해줘야 합니다. 하지만 Java에서는 GC가 이를 대신해 주기 때문에 개발자는 이에 대해 애플리케이션 코드로 관여하지 않습니다. 하지만 GC에 대해 잘 알고 있을 때 시스템적으로 더 좋은 코드를 짤 수 있기때문에 GC의 원리에 대해 알아보겠습니다.

Garbage의 대상

Java의 GC는 Garbage의 대상을 판별하기 위해서 reachability 개념을 사용합니다. reachability는 유효한 참조라고 판단하면 reachable, 아니면 unreachable로 구별합니다. 이때 GC는 unreachable한 객체를 가비지로 판단하고 동작합니다.


위 그림에서 볼 수 있듯이 Heap 영역에 위치하는 객체들의 참조는 4가지 종류로 구분 할 수 있습니다.

  • Java Stack에 의한 참조
  • Method Area의 정적변수에 의한 참조
  • Java Native Stack에 의한 참조
  • Heap 내의 다른 객체에 의한 참조

이 중 root set(유효한 최초의 참조가 발생한 곳)에서 부터 시작한 참조들은 reachable하다고 판단합니다. 즉, 위 4가지 경우에서 'Heap 내의 다른 객체의 의한 참조'는 unreachable 할 수 있는 필요조건입니다. unreachable한 충분 조건은 root set에서 부터 시작한 참조도 아니며 reachable한 객체도 참조하지 않는 Heap 내의 참조입니다. 이런 unreachable한 참조를 대상으로 GC는 동작하게 됩니다.

Reference

0개의 댓글