GC의 원리와 Java의 GC 방식에 대해 설명해 주세요. GC 튜닝이 필요한 이유와 튜닝할 때 고려해야 할 요소에 대해서 추가로 말씀해주세요

박상준·약 8시간 전
0

GC (가비지 컬렉션)

  • 더 이상 참조되지 않는 메모리를 자동으로 회수처리한다.
  • 메모리 누수를 방지한다.
  • 개발자가 메모리 관리를 하지 않고 개발할 수 있도록 도와주는 매커니즘임.

Java 에서의 GC 방식

마크 스윕(Mark-Sweep) 방식

  • 마크 단계
    • 루트에서 시작해서 도달 가능한 객체를 모두 표시한다.
  • 스윕 단계
    • 마크되지 않은 객체들을 메모리에서 제거하여 회수
  • 단순하지만 메모리 단편화 발생 가능성이 있음.

FT_2024-11-15 13-22-52.417.png

마크-컴팩트 방식

  • 마크 단계.
    • 도달 가능한 객체를 표시한다

      [ O ][ X ][ O ][ X ][ O ][ X ]
  • 컴팩트 단계.
    • 살아 있는 객체들을 한쪽으로 이동시켜 메모리를 단편화 없이 회수한다.

      [ O ][ O ][ O ][   ][   ][   ]
  • 메모리 단편화를 방지함.
  • 이동 과정에서 객체 참조가 변경될 수 있음.
    [주소(50 빈 메모리][객체 A (주소 100)][ 객체 B (주소 200) ][ 객체 C (주소 300) ]
    에서
    만약 객체 B가 객체 A 의 주소 100에 대해 참조하는 객체라고 생가한다면
    
    [객체 A (주소 50)][ 객체 B (주소 100) ][ 객체 C (주소 150) ] 로 되는 경우
    여전히 객체 B 에서는 주소 100을 바라보는 문제가 있기에
    
    객체 B의 참조 주소를 50으로 변경해야함.
    
    만약 객체 간의 연쇄적인 참조를 하고있다면 전부다 변경되어야 한다

제너레이션 GC

  • 객체를 young, old, permeGen (자바 8 이전) - (자바 8 이후) Metaspace 으로 구분하여 관리한다.
  • young 세대
    • 단기간 생존 여부가 결정되는 객체들이 존재함.
    • Minor GC 시 주로 처리된다.
  • old 세대
    • 장기간 생존하는 객체들이 위치한다.
    • Major GC 시 주로 처리된다.
  • 퍼머 젠 ( 자바 8 이후 메타스페이스 )
    • 클래스 메타데이터 등 영구적으로 필요한 데이터가 위치됨
  • 객체의 생존 기간에 따라 다른 영역에서 관리함
    • GC 효율성이 증대됨.

그외

  1. Serial GC
    • 단일 스레드를 사용하여 GC를 수행함
    • 작은 어플에 적합하다
  2. Parallel GC
    • 멀티 스레드를 사용해 GC를 병렬로 수행한다
    • 멀티 코어 환경에 최적화되어 있다.
  3. Concurrent Mark-Sweep
    • 대부분의 GC 작업을 어플리케이션 스레드와 동시에 수행
    • GC로 인한 중단 시간을 최소화
  4. G1 (Garbage-First) GC
    • 힙을 여러 개의 영역으로 나누어 우선순위가 높은 영역부터 GC 를 수행한다.
    • 예측 가능한 중단 시간을 제공하여 대규모 힙에 적합

GC 튜닝시 고려 요소

어플리케이션 특성 분석

  • 게임의 경우 빠른 반응
  • DB는 많은 데이터 처리를 할 수 있어야 한다
  • 각각의 프로그램은 다른 방식으로 메모리를 사용하기에, 이에 맞는 GC 설정이 필요하다

힙 크기의 설정

    • 프로그램이 사용하는 메모리 공간인데
    • 힙 크기를 설정하는 것은 해당 메모리 공간의 크기를 정한다
  • 왜 힙 크기가 중요한가?
    • 힙이 너무 작으면 GC가 너무 자주 실행되어 프로그램이 느려진다
    • 너무 크다면 메모리를 낭비할 가능성이 있다
  • 인텔리제이 IDE 에도 힙메모리를 설정하는 기능이 있는데
    • 해당 힙 메모리를 너무 적게 설정하면
      • 프로그램이 뻗어버리는 문제가 발생한다
    • 너무 높으면 점유하는 메모리의 양이 늘어남.
      • 다른 작업에 영향을 준다.

적절한 GC 알고리즘 선택

  • 각각 의 GC 알고리즘에는 다른 장단점이 있기에
  • 프로그램 특성에 맞게 GC 방식을 선택해야한다

GC 로그 분석 관련

  • GC가 어떻게 동작하고 있는지 기록된 로그를 분석한다
  • GC가 얼마나 자주 실행되는지, 시간이 얼마나 걸리는 지 등으로 문제가 있는지 확인이 가능하다.

병렬 처리 설정

  • GC 작업을 여러 개의 CPU 코어에서 동시에 처리하는 설정이다

메타데이터 관리

  • 프로그램이 사용하는 클래스 정보나 기타 데이터의 메모리 관리를 말함
  • 메타데이터도 적당해야함
  • 너무 많이 사용되면 GC 에 부담이 된다.

부하테스트

  • 테스트를 통해 설정이 제대로 되었는지, 문제가 없는지 미리 확인이 가능하다.

모니터링 도구 활용

profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글