[Java] 가비지 컬렉터, 가비지 컬렉션(Garbage Collection)

Beommm·2024년 7월 23일

Java

목록 보기
3/5

Garbage Collection

Garbage Collection, GC는 메모리 관리 기법 중 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 자동으로 찾아내어 해제하는 기능이다. 영어 그대로 가비지 컬렉션 이라고 부른다.
-위키백과


🗑 가비지 컬렉터(Garbage Collector)

프로그램을 개발하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생하게 된다. 옛날의 언어들은 동적인 메모리 할당 기능이 아예 존재하지 않거나 프로그래머가 할당한 뒤 수동으로 해제를 해주어야 하는 방식이었다. 예를 들어 C 언어를 사용할때는 free()라는 함수를 통해 직접 메모리를 해제해야 한다. 하지만 Java 등을 이용해 개발을 한다면 이러한 번거로움을 덜 수 있다. JVM(Java Virtual Machine)의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다. 대신에 Java에서는 명시적으로 불필요한 데이터를 표현하기 위해 일반적으로 null을 선언해준다.


여기서 잠깐!

가비지 컬렉션과 가비지 컬렉터의 차이는?

  • 가비지 컬렉션 : 메모리 관리 기술 중 하나로, 가비지 컬렉터에 의해 수행되는 프로세스를 의미한다.
  • 가비지 컬렉터 : 메모리 관리를 담당하는 시스템 또는 프로그램의 구성 요소. 메모리에서 더이상 사용되지 않은 객체를 찾아 제거하여 메모리를 회수하는 역할을 수행한다.
    🚀한줄요약 : 가비지 컬렉션은 프로세스 그 자체를 의미하고 가비지 컬렉터는 실제 역할을 수행하는 주체를 뜻한다.

가비지 컬렉터의 원리

가비지 컬렉터가 하는 일은 다음과 같다.

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

가비지 컬렉터에 대해 알기 전 우선 메모리에 대한 이해가 어느정도 필요하다. 프로그램을 실행할 때 메모리를 관리하는 OS에 프로그램 실행에 필요한 메모리를 요청하게 된다. 이때 메모리를 어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.
이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 "가비지"가 발생하게 된다. 기존에 차지하고 있던 메모리를 새롭게 선언하거나 형변환이 되면서 주소를 잃어버리게 되고 다시 찾을 수 없게 되며 정리되지 않은 메모리가 생겨버리기 때문이다.
따라서 가비지 컬렉터는 "가비지"를 다른 용도로 사용할 수 있도록 메모리 해제를 시킨다.
Java 기준으로 JVM은 메모리를 부여받고 프로그램을 실행하다가 메모리가 부족해지는 순간이 오면 추가적으로 메모리를 더 요청하는데, 이때 가비지 컬렉터가 실행된다.

[참고 - 자바의 메모리 구조]


자바의 메모리 구조

힙 영역(Heap Memory)

힙 영역은 모든 자바 클래스의 인스턴스(instance)와 배열(array)이 할당되는 곳으로, 런타임(run time) 데이터를 저장하는 영역이다. 힙 영역은 JVM이 시작될 때 생성되어 애플리케이션이 실행되는 동안 크기가 커졌다 작아졌다 한다. 프로그래머가 메모리 관리를 주도적으로 수행할 수 있는 유연성을 제공한다.
이 말은 즉 힙 영역은 메모리 블록을 계속해서 할당하거나 해제할 수 있기 때문에 메모리 누수(Memory Leak)가 발생하기 쉽다는 말과도 같다. 메모리 누수란, 할당된 메모리를 해제하지 않은 채로 메모리를 계속 점유하고 있는 것을 말한다. 이는 시스템의 성능에 영향을 미치며, 심각한 경우는 시스템 충돌을 일으킬 수 있다. 따라서 프로그래머는 힙 영역을 사용할 때 주의를 기울여야 한다.


Stop the world

GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것을 말한다. Stop the world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.


가비지 컬렉터의 한계

  • 어떤 방식의 가비지 컬렉션을 사용하여도 실행 시간 작업을 하는 이상 성능 하락을 피할 수는 없다.
  • 가비지 컬렉터가 존재하더라도 더 이상 접근이 불가능한 객체만 회수하기 때문에 메모리 누수는 발생 할 수 있다.

참고자료

0개의 댓글