ssung_항해일지/항해99_실전 프로젝트

실전 프로젝트 - 34일차

ssungcohol 2023. 4. 13. 10:48

간만에 쓰는 TIL.. 적지 않았다. 이유가 있었겠지..

오늘은 가비지 컬렉터를 알아가보자


가비지 컬렉션, 컬렉터란?

Garbage Collection, 줄여서 GC라고도 한다.

메모리 관리 방법 중에 하나로, 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.

예를 들어 C언어는 프로그래머가 메모리를 할당한 뒤 수동으로 해제까지 직접 해줘야 한다. 그래서 사용자가 메모리를 할당해놓고 필요 없어진 뒤에도 해제를 안하는 일이 생겨 메모리 누수가 있거나, 반대로 해제했던 메모리를 다시 사용하는 실수 때문에 버그가 나오기도 한다.

이러한 문제를 해결하기 위해 제시된 방법이 가비지 컬렉션이다. 가비지 컬렉션 기능을 채택한 언어의 경우에는 가비지 컬렉션에서 제공하는 메모리 할당과 해제를 이용해 자동으로 프로그램이 실행되며 생기는 쓸모없어지는 메모리들을 알아서 수집하고 관리해준다.


가비지 컬렉터의 원리

GC 작업을 하는 가비지 컬렉터는 다음과 같은 일을 한다.

  1. 메모리 할당
  2. 사용 중인 메모리 인식
  3. 사용하지 않는 메모리 인식

가비지 컬렉터를 알기 위해선 메모리에 대한 이해가 필요하다. 프로그램을 실행할 때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 메모리를 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라 한다.

할당된 메모리들은 프로그램이 돌아가면 필연적으로 ‘가비지’가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게 선언하거나 형변환이 되면서 다른 곳을 가리키게 되면서 주소를 잃어버리고 다시 찾을 수 없게 되면서 정리되지 않은 메모리가 생겨버리기 때문이다.

그래서 가비지 컬렉터는 가비지를 다른 용도로 사용할 수 있도록 메모리 해제를 시킨다. 이것이 가비지 컬렉터의 목적이다.

자바 기준으로 JVM은 메모리를 부여받고 프로그램을 실행하다가 메모리가 부족해지는 순간이 오면 추가적으로 메모리를 더 요청한다. 요청하는 순간, 이때 가비지 컬렉터가 실행된다.


Stop-the-world

GC를 실행을 위해 JVM이 애플리케이션 실행을 멈추는 것을 Stop-the-world라 말한다.

stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. 그래서 GC튜닝이라고 말하는 것은 대부분 stop-the-world의 시간을 줄이는 것을 말한다.

GC의 과정을 Mark and Sweep이라고 부른다. 가비지 컬렉터가 닿을 수 있는 모든 변수나 객체들을 스캔하면서 어떤 객체를 가리키고 있는지 찾는 과정을 Mark라고 한다. 이 과정에서 stop-the-world가 발생한다. 이후, Mark 되어 있지 않은 객체들을 힙에서 제거하는 과정이 Sweep이다.


가비지 컬렉터의 한계

  • 어떤 방식의 쓰레기 수집을 사용하든 실행 시간에 작업을 하는 이상 성능 하락을 피할 수는 없다.
  • 쓰레기 수집기가 존재하더라도 더 이상 접근이 불가능한 객체만 회수하기 때문에 메모리 누수는 발생할 수 있음.
728x90