[개념] 가비지 컬렉션

iamhyunji·2022년 5월 10일
4
post-thumbnail

들어가기 전에


개발 관련 공부를 하다 보면, 종종 가비지 컬렉션이라는 단어를 접하게 된다.
문맥의 흐름상 프로그램에서 나온 잉여를 처리하는 무언가 정도로 해석하곤 했는데,
오늘은 그간 막연히 대해 왔던 가비지 컬렉션에 대해 알아보고자 한다.

내 주언어는 javascript이지만, 찾아보니 Java의 가비지 컬렉션에 대한 참고자료가 더 다양했다.
그래서 오늘은 Java 및 JVM의 가비지 컬렉션에 대한 내용 기반으로 포스팅을 작성했으니 읽을 때 참고하면 좋을 것 같다.

가비지 컬렉션


Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects

오라클 공식 문서에 의하면, 가비지 컬렉션은 다음과 같이 정리할 수 있다.

  • 힙 메모리를 확인하는 과정
  • 현재 사용 중인 객체 여부를 확인
  • 사용하지 않는 객체 제거
  • Garbage Collectoin 또는 GC로 불림

여기서 사용 중인 객체란 참조값으로 연결된 객체 또는 프로그램에서 아직 포인터로 연결된 객체를 의미한다.

즉, 가비지 컬렉션은 힙 메모리를 확인하면서 프로그램에서 현재 사용 중인 참조 객체를 파악하고,
사용 중이지 않은 객체는 지워주는 역할을 하고 있다.

동작 원리


  1. 마킹 (Marking)
    마킹 (Marking)
    • 파란색 : 메모리 사용 중 또는 참조 객체
    • 주황색 : 사용하지 않는 메모리 또는 비참조 객체
    • 프로그램에서 현재 사용 중인 메모리 확인
    • 모든 객체를 확인해 메모리 사용 여부 결정내리는 단계
  2. 삭제 (Normal Deletion)
    삭제 (Normal Deletion)
    • 사용하지 않는 메모리 또는 비참조 객체 삭제
    • 메모리 공간 확보
  3. 압축 삭제 (Deletion with Compacting)
    압축 삭제 (Deletion with Compacting)
    • 삭제 (Normal Deletion)에서 성능 향상한 방식
    • 사용하지 않는 메모리 또는 비참조 객체 삭제 + 남아있는 참조 객체 압축
    • 참조 객체를 이동시킴으로써 새로운 메모리 할당이 생겼을 때 할당을 더 쉽고 빠르게 할 수 있음

가비지 컬렉션은 2단계로 이루어지는데, 마킹과 삭제이다.
첫 번째 단계인 마킹에서 메모리를 사용 중인 영역에 대해 확인하고,
사용 하지 않는 객체가 확인되면 두 번째 단계에서 해당 부분을 삭제한다.

삭제에서 성능을 향상시킨 압축 삭제가 있고, 압축 삭제는 기존 삭제 방식 진행 후, 사용 중인 객체를 이동시켜 추후 메모리 할당의 성능을 향상시킨 방식이다.

🔗 참고자료


profile
Lv0. 웹 개발 (❤️❤️❤️🤍)

0개의 댓글