NoTimeForDawdling

가비지 컬렉션(Garbage Collection) 본문

Java

가비지 컬렉션(Garbage Collection)

Room_Energy 2021. 2. 13. 13:10

들어가기

  • C나 C++에서는 OS레벨에서 메모리에 직접 접근하기 때문에 메모리를 명시적으로 해제해줘야 합니다.
    • 그렇지 않으면 memory leak(누수현상)이 발생하게 되며, 현재 실행 중인 프로그램에서 memory leak이 발생하면 다른 프로그램에도 영향을 끼칠 수 있습니다.
  • Java는 OS의 메모리 영역에 직접적으로 접근하지 않고, JVM이라는 가상 머신을 이용해서 간접적으로 접근합니다.
    • JVM은 오브젝트가 필요해지지 않는 시점에서 알아서 메모리를 확보합니다.
    • Java는 가상머신을 사용하여 운영체제로부터 독립적입니다. 그렇기 때문에 OS레벨에서의 memory leak는 불가능하게 된다는 장점이 있습니다.
    • Java가 메모리 누수현상을 방지하는 또 다른 방법이 Garbage Collector 입니다.

GC란?

  • 주소를 잃어버려서 사용할 수 없는 메모리를 말합니다.
    • 즉, 정리되지 않은 메모리를 뜻합니다.
  • GC는 프로그래머가 힙을 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않은 오브젝트들은 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거하도록 하는 것입니다.
  • C++과 같은 언어에서는 사용하지 않은 객체의 메모리는 직접 해제해줘야 하지만 자바는 GC가 알아서 해주기 때문에 굉장히 편리한 장점이 있습니다.

언제 실행되나?

  • JVM은 OS에게 메모리를 부여받고 프로그램들을 실행시킵니다. 그러다 메모리가 부족해지면 OS에게 추가로 메모리를 더 요청하게 됩니다.
  • 여기서 메모리를 더 달라고 요청할 때 GC가 실행됩니다.

GC의 대상은?

  • GC는 가비지 객체를 판별하기 위해 reachability라는 개념을 사용합니다.
    • 어떤 객체에 유효한 참조가 있으면 reachable
    • 참조가 없으면 unreachable, 이 객체를 GC의 대상으로 간주
  • 여기서 말하는 reachable은 Stack에서 Heap 영역의 객체에 대해 참조할 수 있는가를 얘기합니다.

JVM의 메모리 영역에 대해 알고 있다면 좀 더 이해하기 쉬울 것 같습니다.

GC과정 (Mark and Sweep)

  • Mark: JVM의 GC가 Stack영역의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 Reference(참조)하고 있는지 찾는 과정
    • marking 작업을 위해 모든 스레드가 중단됩니다. 이를 stop the world라고 부르기도 합니다.
  • Sweep: mark 되어있지 않은 모든 오브젝트들을 Heap에서 제거하는 과정

만약 Heap에 garbage만 가득하다면 Mark 하는 과정 없이 제거 과정이 즉각 이뤄집니다.

'Java' 카테고리의 다른 글

Enum 클래스 파헤치기  (0) 2021.02.23
[Java] 불변 리스트(Immutable ArrayList)  (0) 2021.02.15
Arrays.asList()  (0) 2021.02.15
Wrapper class Cache 파헤치기  (0) 2021.02.13
Java Virtual Machine(JVM)  (0) 2021.02.13