본문 바로가기

Java

[Java] 가비지 컬렉터(Garbage Collector)는 무엇일까?

728x90
반응형

Java의 Garbage Collector(GC)는 메모리 관리를 자동으로 수행하는 기능이다.

Java에서는 객체를 생성할 때 메모리에 할당하지만, 개발자가 명시적으로 메모리를 해제할 필요는 없다.

개발자를 대신해서 Garbage Collector가 불필요한 객체를 자동으로 감지하고 메모리를 해제시켜 준다.


Garbage Collector의 작동 방식

 

  • 객체의 생성과 참조: Java 프로그램이 실행되면서 객체들이 메모리에 생성된다. 이 객체들은 변수나 다른 객체에 의해 참조된다. 어떤 객체도 참조하지 않는 객체는 "가비지(garbage)"로 간주된다.
  • 가비지 객체의 식별: Garbage Collector는 주기적으로 Heap 메모리를 검사하여 더 이상 참조되지 않는 객체, 즉 가비지 객체를 식별한다. 이 작업은 'Mark and Sweep' 알고리즘을 사용하여 수행된다.
    • Mark 단계: 객체 그래프를 탐색하여 각 객체가 여전히 유효한지, 즉 참조되고 있는지를 표시한다.
    • Sweep 단계: 참조되지 않는 객체들을 메모리에서 해제하여 그 메모리를 다시 사용할 수 있게 만들어 준다.
  • 메모리 해제: 식별된 가비지 객체들은 메모리에서 제거된다. 이 과정에서 Java는 자동으로 가비지 객체들이 점유했던 메모리를 반환하여, 새로운 객체를 위한 메모리 공간을 확보한다.
  • Stop-the-World: Garbage Collection 중 일부 단계에서는 모든 애플리케이션 스레드가 일시적으로 멈추는 'Stop-the-World' 이벤트가 발생할 수 있다. 이로 인해 프로그램의 응답 시간이 잠시 느려질 수 있지만, 일반적으로 사용자가 느낄 수 없을 정도로 짧은 시간 동안만 발생한다.
  • GC의 종류: Java에는 여러 가지 유형의 Garbage Collector가 있다.
    • Serial GC: 단일 스레드로 가비지 컬렉션을 수행한다. 간단하고 메모리 소모가 적지만, Stop-the-World 시간이 길어질 수 있다.
    • Parallel GC: 여러 스레드를 사용하여 병렬로 가비지 컬렉션을 수행한다.
      대규모 멀티코어 시스템에서 성능이 좋다.
    • G1 GC: 주로 대용량 Heap에서 성능을 최적화하기 위해 설계되었다. 메모리를 여러 영역으로 나누어 가비지 컬렉션을 수행한다.
    • ZGC와 Shenandoah GC: 매우 짧은 Stop-the-World 시간을 목표로 하여 대규모 애플리케이션에서 성능을 극대화한다.
  • 튜닝: GC의 동작을 최적화하기 위해 JVM 옵션을 통해 다양한 파라미터를 조정할 수 있다.
    예를 들어, 힙 크기, GC 알고리즘의 선택, 그리고 특정 애플리케이션 요구사항에 맞는 세부 설정 등을 조정하여 성능을 최적화할 수 있다.

결론

Java의 Garbage Collector는 메모리 관리를 자동화하여 개발자가 메모리 할당 및 해제에 신경 쓰지 않고도 안전하게 애플리케이션을 개발할 수 있게 해준다. 하지만 GC의 동작을 이해하고 필요에 따라 최적화하는 것은 고성능 애플리케이션 개발에 있어 중요한 요소이다.

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] HashMap 이란?  (0) 2024.09.11
[Java] Stack(스택)과 Queue(큐)  (0) 2024.09.10
[Java] DTO와 VO 개념과 차이  (0) 2024.08.28
[Java] Enum 데이터 타입  (0) 2024.08.22
[Java] for문과 향상된 for문  (0) 2024.08.21