Daily Dev Q&A: 자바의 Garbage Collection

2025. 11. 25. 18:25·Archive/Daily Dev Q&A

Topic (오늘의 주제)

Java Garbage Collection (GC)


Why (왜 사용하는가? 왜 중요한가?)

  • 실무: C/C++처럼 개발자가 메모리를 직접 해제(free)할 필요가 없어 생산성이 높고, 메모리 누수(Memory Leak)로 인한 치명적인 오류를 막아줍니다.
  • 구조적 의미: '대부분의 객체는 금방 불필요해진다(Weak Generational Hypothesis)'는 가설을 바탕으로 메모리 영역을 효율적으로 나누어 관리합니다.
  • 면접 의도: 서비스의 성능 저하(랙) 원인이 될 수 있는 Stop-the-World 현상을 이해하고 있는지, 상황에 맞는 GC 튜닝이나 트러블슈팅이 가능한지 확인합니다.

Core Concept (핵심 개념 정리)

요소 내용
개념 정의 Heap 메모리 영역에서 동적으로 할당했던 객체 중, 더 이상 참조되지 않는(Unreachable) 객체를 탐지하여 자동으로 제거하는 기법.
동작 원리 Mark and Sweep

1. Mark: 사용 중인 객체(Reachable)를 식별

2. Sweep: 식별되지 않은 객체들을 메모리에서 제거
구조 (Heap) Young Gen: 생명주기가 짧은 객체들이 존재 (Eden, Survivor 0/1 영역)

Old Gen: Young 영역에서 오랫동안 살아남은 객체들이 이동됨
실행 과정 1. Minor GC: Young 영역이 꽉 차면 발생. 속도가 빠름.

2. Major GC (Full GC): Old 영역이 꽉 차면 발생. 속도가 느리고 성능에 영향을 줌.
주의점 Stop-the-World (STW): GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 현상. 모든 스레드가 정지하므로 성능 이슈의 주범이 됨.

Interview Answer Version (면접 답변식 요약)

"Garbage Collection은 자바의 힙 메모리에서 사용되지 않는 객체를 자동으로 제거해주는 프로세스입니다.

GC는 객체의 생존 기간에 따라 힙 영역을 Young 영역과 Old 영역으로 나누어 관리합니다. Young 영역에서 발생하는 GC를 Minor GC, Old 영역까지 꽉 차서 발생하는 GC를 Major GC라고 합니다.

특히 GC가 실행될 때 애플리케이션이 멈추는 Stop-the-World 현상이 발생하는데, 이를 최소화하는 것이 성능 튜닝의 핵심입니다."


Practical Tip (사용시 주의할 점 or 활용 예)

1. System.gc() 절대 사용 금지

코드 내에서 System.gc()를 직접 호출하는 것은 매우 위험합니다. 이는 시스템 전체를 멈추게 하는(Stop-the-world) Full GC를 강제로 유발할 수 있어 실제 운영 중인 서버 성능에 치명적입니다.

2. G1GC (Garbage First GC)의 이해

과거에는 Serial, Parallel GC 등을 썼지만, 최근(Java 9 이상) 기본 GC는 G1GC입니다.

  • G1GC는 전체 Heap을 일정한 크기의 Region으로 나누어 관리하며, 전체를 다 뒤지는 것이 아니라 가비지가 많은 Region부터 청소하여 STW 시간을 획기적으로 줄였습니다. 대용량 메모리 서비스에서 필수적입니다.

3. 메모리 누수 패턴 주의

GC가 있어도 메모리 누수는 발생합니다.

  • Close 하지 않은 리소스: DB Connection, IO Stream 등.
  • Static 변수의 무분별한 사용: Static은 GC 대상이 되지 않으므로 주의해야 합니다.

예상 꼬리 질문 정리

  1. Stop-the-World가 무엇이며, 왜 발생하나요?
    • 답변 포인트: GC가 메모리를 정리하는 동안 객체의 메모리 주소가 바뀔 수 있기 때문에, 안전한 처리를 위해 애플리케이션 스레드를 모두 멈춰야 함을 설명.
  2. Minor GC와 Major GC(Full GC)의 차이점은?
    • 답변 포인트: 대상 영역(Young vs Old), 발생 빈도(자주 vs 가끔), 속도(빠름 vs 느림/부하 큼) 비교.
  3. Java 버전별 Default GC 알고리즘을 아시나요?
    • 답변 포인트: Java 8(Parallel GC) -> Java 9 이후(G1GC). 최신 트렌드인 ZGC 등에 대한 언급도 좋음.

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?  (0) 2025.12.01
Daily Dev Q&A: 자바의 예외 처리(Exception) 구조  (0) 2025.11.28
Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?  (0) 2025.11.28
Daily Dev Q&A: 자바의 메모리 구조  (0) 2025.11.26
Daily Dev Q&A: JVM  (0) 2025.11.24
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 자바의 예외 처리(Exception) 구조
  • Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?
  • Daily Dev Q&A: 자바의 메모리 구조
  • Daily Dev Q&A: JVM
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    데브페스트
    REACT
    til
    DevFestIncheon2025
    클로드코드
    devlog
    jpa
    Spring비교
    경기기후바이브코딩
    Project_Review
    SpringBoot
    프로덕트개발자
    network
    backend
    aws_s3
    커리어리셋
    프로젝트회고
    OrphanRemova
    spring
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 자바의 Garbage Collection
상단으로

티스토리툴바