🥭 개요
가비지 콜렉션(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
에 할당되면서 tv1
과 tv2
는 같은 객체를 가리키게 되면서 기존 tv2
를 가리키는 참조 변수가 사라졌다. 그림을 통해 다시 살펴보자.가비지 콜렉션의 후보에 올라오게 되는 조건
이해하기 쉽게 땅으로 표현을 해보았다.
tv2=tv1;
코드로 인해서 tv1
의 참조변수가 tv2
으로 복사가 되면서 같은 땅인 부전동 100번지
를 가리키게 되었고, 부전동 276번지
를 참조하는 변수가 사라지게 된 것이다.이렇게 어떤 변수도 참조하지 않는 객체를
JVM
에서는 자동으로 collecting
을 하고 시스템이 한가할 때 또는 힙 메모리가 부족해 질때 Garbage Collecting
을 하게 되는 것이다. 가비지 콜렉션의 활동 절차
위에 그림에서와 같이 첫 번째 단계에서
참조되지 않은 객체가 식별
되고 가비지 수집 준비가 된것으로 표시가 된다. 두 번째 단계에서는 표시가 된 객체들이 삭제
가 된다. 그 후 가비지 컬렉터가 메모리를 압축
을 하여 남는 공간에 새 객체를 순차적으로 할당
할 수 있게 해준다. 🍏 가비지 콜렉션 단점?
자바의 가비지 컬렉션에 대해 이해해야 하는 가장 중요한 점 중 하나는 이 작업이
비결정적
이며 가비지 수집이 발생할 때를 예측할 수 없다
는 것이 특징이자 단점이다. System.gc()
또는 Runtime.gc()
메소드를 사용하여 가비지 컬렉터를 실행하는 모드에 힌트를 줄 수는 있지만, 가비지 컬렉터가 실제로 실행된다는 보장은 없다. 자바 가비지 컬렉션을 조정하는 가장 좋은 방법은 JVM을 실행할 때 플래그를 설정하는 일이다. 예를 들어서 사용할 가비지 콜렉터, 히프 메모리의 초기 및 최대 크기, 히프 메모리 섹션의 크기들을 조정할 수 있다.
“Parallel Garbage Collector”
를 사용하려면 다음과 같이 JVM을 실행하면 된다. C> java -xx:UseParallelGC -jar Application.java
Share article