HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
🏕️
Gabage Collector
🏕️

Gabage Collector

progress
Done
Tags
Java
GC 가 무엇인지GC의 장점 및 단점heap 구조 [gc 출몰지역]GC의 수거 대상: ReachabilityGC가 왜 있어야 하는지

GC 가 무엇인지

💡
더이상 사용하지 않는 객체 등을 메모리에서 해제(삭제)하는 JVM의 작업Java 프로세스가 동작하는 과정에서 GC는 불필요한 또는 더이상은 사용하지 않는 객체들을 메모리에서 제거함으로써, Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 해준다.
 

GC의 장점 및 단점

  • 장점
    • 개발자의 실수로 인한 치명적인 프로세스 오작동을 예방할 수 있다.
    • 개발자가 메모리를 크게 신경 안써도 된다(코드를 짤때 메모리 효율도 생각하긴 해야함)
  • 단점
    • 언제 일어날지 모른다
    • Stop-The-World
      • Stop-The-World는 직역하면 세상을 멈춘다는 거대한 말같지만 어플리케이션에 정말 거대한 영향을 미치는 아이다. 쉽게 말해 가비지컬렉터를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. Stop-The-World이 발생하면 gc를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 멈춘다. 그래서 이 시간이 길면 길수록 어플리케이션이 느려진다. 그리고 어떤 gc 알고리즘을 사용하던지, Stop-The-World는 발생하기에 이 시간을 줄이는 것이 gc알고리즘의 키포인트다.
추가자료
그리고, GC는 weak generational hypothesis 아래 내용에 의해서 도입되었다.
① 대부분의 객체는 금방 unreachable이 된다.
: 아래 for문 안에서 생성된 100개의 Obj는 더이상 사용되지 않을 것.
for (int i = 0; i < 1000; i++){ NewObject obj = new NewObject(); obj.doSomething(); }
② 오래된 객체에서 생성된지 얼마안된 객체로의 참조는 적다. - POJO객체(Plain Old Java Object)
: 보통 어떤 값이나 상태를 저장하기 위해 POJO 객체를 생성하고, 다른 메소드나 클래스에 전달하고, 다 사용한 객체는 더이상 사용하지 않는다.
NewObject obj = new NewObject("value"); doSomething(obj);

heap 구조 [gc 출몰지역]

heap 영역에서 어떤 방식으로 GC가 발생하는지 heap 구조를 통해 세부적으로 알아봅시다.
heap 영역은 크게 Young Generation과 Old Generation으로 나뉩니다.
notion image
  • Young Generation은 새로운 객체들이 할당되는 영역이고 Old Generation은 Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역입니다.
  • Young Generation은 Eden, Survivor 0, Survivor 1로 나누어집니다.
  • 이러한 heap 구조에서 GC가 언제 일어날까요?

GC의 수거 대상: Reachability

즉, Unreachable Objects는 참조되지 않은 객체이며 Reachable Objects는 참조된 객체라고 볼 수 있습니다.
notion image
사진과 같이 GC 루트에서부터 각각 참조하고 있는 객체들을 하나씩 하나씩 탐색해나갑니다.
그러면 참조된 객체들은 Reachable Objects, 참조되고 있지 않은 객체들을 Unreachable Objects 하다고 표현합니다. 이러한 Unreachable Objects가 GC의 수거 대상이 됩니다.
그렇다면 GC 루트가 될 수 있는 조건은 무엇?
  • JVM stack 영역의 지역변수나 파라미터들, 메소드 영역에 있는 static 데이터들, 자바 네이티브 인터페이스에 의해 생성된 객체들이 해당됩니다.

GC가 왜 있어야 하는지

  • GC가 있어야 효율적으로 메모리를 관리할 수 있게 되며 개발자의 실수로 인한 치명적인 피해를 줄일 수 있기 때문이다.
  • 메모리는 무한한 자원이 아닌 유한한 자원이며 그 안에서 최대한 효율적으로 관리함에 있어 사용자들에게 서비스함에 있어 불편함이 없으며 따로 오토 스케일링이라는 작업에 대한 비용을 지불하지 않는 이점이 있기 때문이다.