JAVA 가비지 콜렉션의 활동 원리

#JAVA009 #메모리 #힙메모리관리
Dec 22, 2023
JAVA 가비지 콜렉션의 활동 원리
 
 

🥭 개요

가비지 콜렉션(Garbage Collection)은 프로그래밍에서 자동 메모리 관리의 한 형태이다. 이는 프로그램이 더 이상 사용하지 않는 메모리 영역을 자동으로 찾아서 재활용하는 과정이라고 보면 된다. 가비지 콜렉션이 필요한 이유는 메모리 관리를 수동으로 하는 것이 복잡하고 오류가 발생 하기 쉽기 때문이다. 하지만 이것은 또 특정한 한계를 가진 상황에서는 모든 메모리를 수동적으로 관리해야 메모리의 효율성을 높일 수 있으므로 그러한 때는 자동 메모리 관리가 약점이 될 수도 있다.
 
따라서 이러한 메모리 관리 시스템이 어떻게 운영되는 지에 따라서 Managed언어Unmanaged언어로 나누어지기도 한다. 가비지 콜렉션을 알아보기에 앞서서 이 두 언어에 대해서 간략히 알아보고 넘어가자.
 
 

🍊 Managed언어 vs Unmanaged언어

 

Managed 언어

Managed언어는 가비지 콜렉션과 같은 자동 메모리 관리 기능을 제공하는 언어이다. 이 때문에 프로그래머는 메모리 할당과 해제에 대해 신경 슬 필요가 적다. 언어로는 Java, C#, Python등이 대표적인 Managed언어이다. 이들 언어들의 특징은 가상머신위에서 실행되며, 이런 환경에서 코드의 실행을 관리하고, 보안, 메모리 관리, 예외처리 등을 담당한다.
  • 장점 : 프로그래밍이 상대적으로 쉽고, 메모리 관리 오류로부터 보호될 수 있다.
  • 단점 : 가비지 콜렉션에 의한 성능 오버헤드가 발생할 수 있으며, 하드웨어 자원에 대한 제어 제한적일 수 있다.
 

Unmanaged 언어

Unmanaged 언어는 프로그래머가 직접적으로 메모리를 직접 할당하고 해제를 담당해야한다. 이는 더 높은 수준의 제어를 가능하게 하지만, 사람의 오류가 잦을 수 있다. 즉, 메모리 누수와 같은 오류가 발생할 가능성이 커진다. 대표적인 언어로는 C C++이 있다. 이러한 언어들은 하드웨어에 더 직접적으로 접근 할 수 있으며 성능 최적화에 유리하다.
  • 장점 : 메모리와 시스템 리소스에 대한 더 세밀한 제어가 가능하다. 이는 곧 성능 최적화와 하드웨어에 가까운 프로그래밍에 유리하다.
  • 단점 : 메모리 관리 오류의 가능성이 높으며, 프로그래밍이 더 복잡해질 수 있다.
 
 

🍋 가비지 콜렉션 원리

자바에서는 객체를 생성하는 연산자는 있지만, 객체를 삭제하는 연산자는 없다. 다른 언어에서는 이렇게 메모리를 할당 받은 객체들을 프로그래머가 삭제까지 책임져야되기도 한다. 사실 개발자가 자신이 할당 받은 동적 메모리를 기억하고 있다가 사용이 끝나면 반환하는 것은 상당히 번거로운 일이다. 따라서 자동으로 관리해주는 자바의 이 기능이 장점이 된다.
 
모든 가비지 컬렉션은 자동으로 이루어진다. 그럼 가비지 컬렉션은 객체가 사용되지 않는 지 어떻게 판단 하는 것일 까?? 아래 코드를 한 번 살펴보자.
 
Television tv1 = new Television(); Television tv2 = new Television(); tv2 = tv1;
 
여기서 어느 곳이 가비지 컬렉션의 후보에 올라왔는지 보이는가?
세 번째 라인에 tv1의 참조 주소값이 tv2에 할당되면서 tv1tv2는 같은 객체를 가리키게 되면서 기존 tv2를 가리키는 참조 변수가 사라졌다. 그림을 통해 다시 살펴보자.
 
 
가비지 콜렉션의 후보에 올라오게 되는 조건
notion image
 
이해하기 쉽게 땅으로 표현을 해보았다. tv2=tv1;코드로 인해서 tv1의 참조변수가 tv2으로 복사가 되면서 같은 땅인 부전동 100번지를 가리키게 되었고, 부전동 276번지를 참조하는 변수가 사라지게 된 것이다.
 
이렇게 어떤 변수도 참조하지 않는 객체를 JVM에서는 자동으로 collecting을 하고 시스템이 한가할 때 또는 힙 메모리가 부족해 질때 Garbage Collecting을 하게 되는 것이다.
 
 
가비지 콜렉션의 활동 절차
notion image
 
위에 그림에서와 같이 첫 번째 단계에서 참조되지 않은 객체가 식별되고 가비지 수집 준비가 된것으로 표시가 된다. 두 번째 단계에서는 표시가 된 객체들이 삭제가 된다. 그 후 가비지 컬렉터가 메모리를 압축을 하여 남는 공간에 새 객체를 순차적으로 할당할 수 있게 해준다.
 
 

🍏 가비지 콜렉션 단점?

자바의 가비지 컬렉션에 대해 이해해야 하는 가장 중요한 점 중 하나는 이 작업이 비결정적이며 가비지 수집이 발생할 때를 예측할 수 없다는 것이 특징이자 단점이다.
 
System.gc() 또는 Runtime.gc() 메소드를 사용하여 가비지 컬렉터를 실행하는 모드에 힌트를 줄 수는 있지만, 가비지 컬렉터가 실제로 실행된다는 보장은 없다. 자바 가비지 컬렉션을 조정하는 가장 좋은 방법은 JVM을 실행할 때 플래그를 설정하는 일이다.
 
예를 들어서 사용할 가비지 콜렉터, 히프 메모리의 초기 및 최대 크기, 히프 메모리 섹션의 크기들을 조정할 수 있다. “Parallel Garbage Collector”를 사용하려면 다음과 같이 JVM을 실행하면 된다.
 
C> java -xx:UseParallelGC -jar Application.java
Share article

AI_Nomads