본문 바로가기
JAVA

JAVA / 가비지 컬렉션(garbage collection)

by LWM 2020. 5. 31.
반응형

가비지 컬렉션이란 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 자동해제하는 기능이다. 즉, 더이상 참조하지 않는 힙의 쓰레기 메모리 공간을 자동으로 날려주는것이다.

이러한 가비지 컬렉션 기능을 가지고 있는 언어를 매니지드 언어라고하며 없는 언어들은 언매니지드 언어라고한다.

자바와 C#은 대표적인 매니지드 언어이며 C와 C++은 대표적인 언매니지드 언어이다. 보통의 언어들은 메모리관리를 할수 있지만 자동의 여부에 따라 매니지드 언어이냐, 언매니지드 언어이냐 나뉘게 되는것이다. 자바는 더티페이지가 존재하며 가비지가 어느정도 쌓이면 처리한다. 또한 가비지 컬렉션은 자바에서 준비된 가비지 컬렉션 스레드에 의해 처리된다.

 

GC전 메모리

 

 

GC후의 메모리

 

 

 

- 그렇다면 가비지컬렉션은 언제 작동하는가?

 

PC의 경우 워낙 메모리가 크기 때문에, 가용 메모리가 거의 없어지는 극한 상황은 잘 일어나지 않아 메모리 부족으로 인한 가비지 컬렉션이 작동하는 것을 보는 것은 쉽지 않다. 또한 자바 플랫폼 내부의 판단에 의해 가비지 컬렉션이 수행되므로 언제 가비지 컬렉션이 일어날지 알기 어렵다. 비교적으로 큰 규모의 자바프로그램 개발 경험을 가진 개발자들은 가끔 프로그램을 테스트하는 도중 프로그램의 실행이 일시적으로 중단된 것처럼 보이는 경험을 한다고 한다. 규모가 큰 자바 프로그램은 실행 중 비교적 많은 양의 가비지를 생산한다. 그러다가 가끔 가용 메모리가 부족해지는 경우가 있는데, 이때 가비지 컬렉터가 실행되며 응용 프로그램은 실행을 멈추고 가비지 컬렉션이 끝나기를 기다리게 되어, 사용자의 눈에는 프로그램이 중단된 것처럼 보인다. 이러한 이유로 자바는 실시간 처리에는 부적합하다.

 

 

 

- 가비지 컬렉션 강제요청

 

응용프로그램에서 System 또는 Runtime객체의 gc()메소드를 호출하면 가비지 컬렉션을 요청할 수 있다.

System.gc();

또는

Runtime.getRuntime().gc();

그러나 윗 문장들을 호출한다고 즉시 가비지 컬렉터가 작동하는 것은 아니다. 윗 코드들은 가비지 컬렉션이 필요하다는 요청에 불과하며 가비지컬렉션은 자바가 전적으로 판단하여 적절한 시점에 작동시킨다.

반응형