< 가비지 컬렉션이란? >

Java에서 가비지 컬렉션(Garbage Collection, 이하 GC)은 프로그램이 동적으로 할당한 메모리를 자동으로 관리하는 과정이다. 이는 프로그래머의 잘못으로 인한 메모리 누수 및 메모리 부족 문제를 방지하는데 매우 중요한 역할을 한다.

C/C++과 같은 언어에서는 프로그래머가 객체를 생성하고 파괴하는 것을 직접 관리해야 하는데. 이 과정에서 프로그래머의 실수로 불필요한 객체가 제거되지 않는다면, 시간이 지남에 따라 메모리 공간이 부족해져 프로그램이 비정상적으로 종료될 수 있다. 이러한 문제를 방지하기 위해 Java에서는 GC라는 기능을 제공해준다. GC는 더 이상 사용되지 않는 객체를 자동으로 감지하여 메모리에서 제거하는 역할을 한다.

< 가비지 컬렉션의 원리 >

Java의 GC는 자동적으로 작동한다. 이 과정은 Heap 메모리를 살펴보고 사용 중인 객체와 사용하지 않는 객체를 구분하여 사용하지 않는 객체를 삭제하는 과정이다. 여기서 사용 중인 객체란 프로그램의 어떤 부분이라도 그 객체에 대한 참조를 가지고 있는 객체를 의미하며, 사용하지 않는 객체란 프로그램의 어떤 부분도 해당 객체를 참조하고 있지 않는 객체를 의미한다.

 

< 가비지 컬렉션의 동작 방식 >

Minor GC: 새로운 객체가 생성되면 처음에는 'Young Generation'이라는 힙 영역에 배치되고, 'Young Generation' 영역이 가득 차면, GC는 이 영역에서 더 이상 참조되지 않는 객체들을 제거하는 Minor GC를 수행한다.


Major GC (Full GC): Young 영역에서 오랫동안 살아남은 객체들은 'Old Generation' 영역으로 이동된다. 이 영역에서는 객체들이 덜 빈번하게 제거되기 때문에, GC는 주로 Minor GC에 비해 덜 빈번하게 발생하는 Major GC를 수행한다.

 

 


실제 프로그램에서는 GC가 실행되면, GC를 실행하는 스레드외에 나머지 스레드는 멈춘다.

Minor GC같은 경우 영역이 작기 때문에  잠깐 멈추는 것이기에 Impact가 적지만, 만약에 Old Generation이 가득 차서 Major GC가 발생하면 오래된 시간 동안 프로그램이 동작하지 않을 수 있다. 그러면 큰 문제가 생길 수 있기에 주의해야 한다. 

 

< GC로 인해 애플리케이션이 멈추는 시간을 최소화하는 방법 >

 

Heap 사이즈 조정: GC가 발생하는 주된 이유는 힙 메모리가 부족하기 때문이다. 따라서 힙 메모리를 적절하게 확장하는 것은 GC를 효과적으로 관리하는 방법 중 하나다. 하지만 너무 큰 힙 사이즈는 GC 시 정지 시간을 늘릴 수 있으므로 적절한 사이즈 조정이 필요하다.

GC 알고리즘 선택: Java는 서로 다른 GC 알고리즘을 제공하며, 각 알고리즘은 다른 유형의 워크로드에 적합하다. 예를 들어, G1 (Garbage-First) GC와 CMS (Concurrent Mark Sweep) GC는 GC 정지 시간을 최소화하는 데 초점을 맞추고 있다. ZGC (Z Garbage Collector)나 Shenandoah와 같은 알고리즘들은 정지 시간을 매우 짧게 유지하면서 대용량 힙을 관리할 수 있다.

객체 할당과 생존 기간 최적화: 객체의 생명 주기를 최적화하면 GC가 더 효율적으로 작동할 수 있다. 장기간 살아있는 객체를 줄이고, 불필요한 객체 생성을 피하는 것이 중요하다. 이렇게 하면 Young Generation에서 대부분의 객체가 처리되고, Major GC를 피할 수 있다.

GC 로그 분석: GC 로그를 주기적으로 분석하면 GC의 동작 방식을 더 잘 이해하고 문제를 조기에 발견할 수 있다. GC 로그는 어떤 종류의 GC 이벤트가 발생했는지, 얼마나 자주 발생했는지, 그리고 얼마나 오래 걸렸는지 등의 중요한 정보를 제공한다.

자바 버전 업데이트: 새로운 자바 버전은 종종 성능 개선과 함께 GC 알고리즘의 개선을 포함하고 있다. 최신 버전의 Java를 사용하면 GC 성능이 향상될 수 있다.

 

 

 

 

Reference : https://www.geeksforgeeks.org/garbage-collection-java/

 

Garbage Collection in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

'Java' 카테고리의 다른 글

Thread async in Java  (0) 2023.06.02
Assert.isTrue()  (0) 2023.05.15
Wrapper Class  (0) 2023.05.14
05.인스턴스 생성과 힙 메모리  (0) 2023.04.23
04.객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다.  (0) 2023.04.23

+ Recent posts