[Java/자바] Garbage Collection

sbj·2024년 1월 2일

Java

목록 보기
15/15

2023년 12월 25일

2024년 1월 1일


자바의 가비지 콜렉션 / Garbage Collection in Java

자바의 가비지 콜렉션은 자바의 메모리 관리 기법 중 하나로, 동적으로 할당된 메모리 영역 중 사용되지 않는 영역을 자동적으로 회수하고 관리하는 프로세스이다.

C, C++ 에서는 개발자가 직접 객체의 생성과 파괴를 해줘야한다. 만약 개발자가 쓸모없는 객체 파괴를 잊어버린다면?
시스템의 메모리는 계속 증가할 것이며 결국 메모리 누수가 발생한다. 특정 시점이 지나면 더 이상 새로운 객체를 생성하는 데 메모리를 사용할 수 없으며, 결국 메모리 부족 오류로 전체 애플리케이션이 종료될 수 있다.

하지만, 자바에서는 JVM이 구성된 JRE가 제공되며, 그 구성요소 중 하나인 Garbage Collection이 자동으로 사용되지 않는 객체를 파괴한다.


‘Stop - the - world’

GC에 대해 더 알아보기 전에, stop-the-world를 알아야한다. stop-the-world란 GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.

어떤 알고리즘을 사용하더라도 stop-the-world는 발생하게 되는데, 대개 GC 튜닝은 stop-the-world 시간을 줄이는 것이다. (이 시간동안 사용자 요청을 처리할 수 없으므로) GC를 해도 더 이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면 OutOfMemoryError가 발생하여 웹 애플리케이션 서버(WAS)가 다운을 초래할 수 있다.


📍 가비지 컬렉션의 대상은?

기본적으로 JVM의 메모리는 총 5가지 영역 (class, stack, heap, native method, PC)으로 나뉘는데, GC는 힙 메모리만 다룬다.

가비지 컬렉션의 대상이 되는 객체는 주로 다음과 같은 경우에 해당된다:

1. 객체가 null로 설정된 경우:

  1. 객체에 null을 할당하면 해당 객체에 대한 모든 참조가 제거되고, 가비지 컬렉션의 대상이 된다.

    예를 들어, Object obj = new Object(); 이후 obj = null;이 실행되면 obj가 가리키는 객체는 가비지 컬렉션의 대상이 된다.

2. 참조하는 변수가 메서드가 끝나는 등의 이유로 스코프를 벗어난 경우:

  1. 메서드 내에서 생성된 지역 변수는 메서드가 종료되면 스코프를 벗어나게 된다. 이 경우에도 해당 객체는 가비지 컬렉션의 대상이 된다.

    예를 들어, 메서드 내에서 Object obj = new Object();가 실행되고, 메서드가 종료되었다면 obj가 가리키는 객체는 가비지 컬렉션의 대상이 된다.

3. 자식 객체가 부모 객체에 의해 접근되지 않는 경우:

  1. 부모 객체가 없어지면 자식 객체들은 더 이상 접근할 수 없게 된다.

    예를 들어, List<Object> list = new ArrayList<>(); 이후 list = null;이 실행되면, list가 가리키는 ArrayList와 그 안의 모든 객체는 가비지 컬렉션의 대상이 된다.


📍 Marking → Normal Deletion → Compacting

가비지 컬렉션 과정은 크게 '마킹', '노멀 딜리션', 그리고 '컴팩팅' 세 단계로 나뉜다.

1. Marking

  • 프로세스는 어떤 메모리가 사용 중인지, 어떤 메모리가 사용되지 않는지 확인하기 위해 마킹을 호출한다.
  • 사용 중인 메모리는 reachable로 표시되고, 사용되지 않는 메모리는 unreachable로 표시된다.
  • 모든 오브젝트는 마킹 단계에서 결정을 위해서 스캔되어지는데, 모든 오브젝트를 스캔하기에 매우 많은 시간이 소요된다.

2. Normal Deletion

  • 마킹 단계가 완료되면 가비지 컬렉터는 unreachable로 표시된 메모리를 해제하는 노멀 딜리션 단계를 진행한다.
  • 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해두었다가, 새로운 오브젝트가 선언되면 할당되도록 한다.

3. Compacting

  • Normal Deletion을 거쳐 사용되지 않는 객체를 제거한 이후, 메모리 공간이 조각날 수 있다. 이런 메모리 단편화를 방지하고자 가비지 컬렉터는 메모리를 한 쪽으로 이동시키는 컴팩팅 단계를 진행한다.
  • 이들을 묶음으로써 연속적 메모리 공간이 발생하므로, 새로운 메모리 할당 시 더 쉽고 빠르게 진행할 수 있다.

Generational Garbage Collection

객체 생명주기에 따라 메모리를 관리한다?

  • 생명주기에 따라 메모리를 관리하면 GC 작업을 최적화할 수 있다.

자바의 가비지 컬렉션은 힙 메모리를 세 가지 부분으로 나눠 관리한다.

1. Young Generation

새롭게 생성한 객체의 대부분이 여기에 위치한다. Eden과 Survivor 영역으로 나뉘는데, 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 말한다.

2. Old Generation

Young 영역에서 살아남은 객체들이 이동하는 영역이다. 이 영역에서 객체가 사라질 때, Major GC 혹은 Full GC가 발생한다고 말한다. 크기가 큰 만큼 Young 영역보다 GC는 적게 발생하지만 Young 영역에 비해 Stop-The-World가 길어질 수 있다.

3. Permanent Generation

Method 영역이라고도 하는데, JVM에 의해 사용되는 클래스나 메소드에 대한 메타 정보가 저장되는 영역이다.


Generational Garbage Collection 과정

단계설명
1. 객체 생성새로운 객체가 생성되면, 처음에는 Young Generation의 Eden Space에 할당된다.
2. Minor GCEden Space가 가득 차면, Minor GC가 시작된다. 여전히 참조되는(reachable) 객체들은 Survivor Space로 이동하고, 참조되지 않는(unreachable) 객체들은 Eden Space가 clear될 때 반환된다.
3. Survivor Space다음 Minor GC가 실행될 때, Eden Space에서 살아남은 객체는 Survivor Space로 이동한다. 이 과정은 Minor GC가 실행될 때마다 반복된다.
4. Major GCYoung Generation에서 살아남은 객체들은 Old Generation으로 이동한다. Old Generation 영역에서 객체가 사라질 때 Major GC(또는 Full GC)가 발생한다.
5. Permanent GenerationJVM에 의해 사용되는 클래스나 메소드에 대한 메타 정보가 저장되는 영역이다.

🤷🏼‍♀️ 궁금한 것

  1. 객체의 생명 주기를 GC는 어떻게 판단하나?
    1. 객체의 생명주기를 판단하기 위헤 reachability 개념을 사용한다. 사용 중/사용중이지 않은 메모리를 reachable, unreachable로 판단한다고 정리했다. 힙 메모리에 할당된 객체가 다른 루트객체에 의해 참조되지 않는 경우, 즉 unreachable일 경우 ‘가비지’로 판단된다.
    2. 반면, reachable, 즉 계속 참조되고 있는 객체는 살아있는 것으로 판단하고, Old Generation 영역으로 이동하게 된다.

2024년 1월 2일

📝 정리

  1. 가비지 컬렉션의 기본 원리는 무엇인가?
    1. 자바의 가비지 콜렉션은 자바의 메모리 관리 기법 중 하나로, Heap 메모리 영역에서 사용되지 않는 메모리 영역을 자동적으로 회수하고 관리하는 프로세스이다.
      1. JRE의 구성요소 중 하나인 가비지 콜렉션이 자동으로 사용되지 않는 객체를 파괴한다.
  2. 'Stop - the - world'이란?
    1. GC를 실행하기 전에, JVM이 실행중인 애플리케이션을 멈추는 것이다.
      1. 이 시간동안 사용자 요청을 처리할 수 없으므로 GC 튜닝은 Stop-the-word 시간을 줄이는 것이다. GC를 해도 더 이상 사용 가능한 메모리 영역이 없는데, 계속 메모리를 할당하려고 하면 OutOfMemoryError가 발생하여 웹 애플리케이션 서버(WAS) 다운을 초래할 수 있다.
  3. 가비지 컬렉션의 대상이 되는 객체는 어떤 것들인가?
    1. 객체가 Null로 설정된 경우
    2. 참조하는 변수가 메소드가 끝남을 이유로 스코프를 벗어난 경우
    3. 자식 객체가 부모 객체에 의해 접근되지 않는 경우
  4. '마킹', '노멀 딜리션', 그리고 '컴팩팅'이란?
    1. 가비지 컬렉션 과정은 크게 마킹 → 노멀 딜리션 → 컴팩팅 세 단계로 나뉜다.
      1. 마킹에서는 : 어떤 메모리가 사용중인지 혹은 사용되지 않는지 확인하기 위해 마킹을 호출한다. 사용중인 메모리는 reachable로 표시되고, 사용되지 않는 메모리는 unreachable로 표시된다.
      2. 노멀 딜리션에서는 : 가비지 컬렉터는 unreachable로 표시된 메모리를 해제하는 노멀 딜리션 단계를 진행한다.
      3. 컴팩팅에서는 : 노멀 딜리션을 거쳐 사용되지 않는 객체가 제거된 이후, 메모리 공간이 조각날 수 있다. 즉, 메모리 단편화가 발생할 수 있는데, 메모리를 한 쪽으로 이동시키는 컴팩팅 단계를 진행한다
  5. Generational Garbage Collection이란?
    1. 객체 생명주기에 따라서 메모리를 관리하는 것이다. 자바 가비지 컬렉션은 힙 메로리를 세 가지 부분으로 나눠 관리한다.
      1. Young Generation
        1. 새롭게 생성된 객체 대부분이 여기에 할당된다. Eden, Survivor 영역으로 나뉘는데, 대부분의 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 한다.
      2. Old Generation
        1. Young 영역에서 살아남은 객체들이 이동한다. 이 영역에서 객체가 사라질 때 Major GC, Full GC가 발생한다고 말한다.
      3. Permanent Gereration
        1. Method 영역이라고 하는데, JVM에 의해 사용되는 클래스나 메소드에 대한 메타 정보가 저장되는 영역이다.

profile
Strong men believe in cause and effect.

0개의 댓글