GC에 대해 공부해보자

ideal dev·2023년 6월 25일
0

기술면접

목록 보기
3/3
post-thumbnail

자바는 메모리를 자동으로 주기적으로 정리해주는 기능이 있습니다. 이름하야 GC.

가비지 컬렉터(Garbage Collection)

  • Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스
    • 여기서 동적으로 할당했던 메모리 영역 : 프로그램 런타임에 사용되는 Heap 영역 메모리
    • 필요 없게 된 영역 : 어떤 변수도 가리키지 않게 된 영역

GC 작동원리

Young 영역

  • 새롭게 생성된 객체가 할당되는 영역
  • Young영역에 대한 GC를 Minor GC라고 부릅니다.
  • Eden, Survivor0, Survivor1 으로 나뉨
    • Eden
      : new를 통해 새로 생성된 객체가 위치
      : 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보냄
    • Survivor 0/1
      : 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
      : Survivor 0 또는 Survivor 1 둘 중 하나에는 꼭 비어 있어야 함
      : 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 모두 사용량이 0이라면 현재 시스템이 정상적인 상황이 아님

Survivor 영역이 2개인 이유 !?


외부 단편화 문제를 해결하기 위해서 입니다. 메모리가 할당되고 헤제되기를 반복하다 보면 왼쪽 사진과 같이 총 메모리 공간은 남지만, 파편화되어있어 메모리를 할당할 수 없는 문제가 발생합니다. (외부 단편화)

age !?

  • minorGC 때 garbage되어 사라지지 않고, Survivor영역에서 살아남은 횟수를 의미하는 값
  • age 값이 임계값에 다다르면 Promotion(Old 영역으로 이동) 여부를 결정합니다.
  • Object Header에 기록됨
    - JVM 중 가장 일반적인 HotSpot JVM age의 기본 임계값 : 31
    • 객체 헤더에 age를 기록하는 부분이 6 bit로 되어 있기 때문

Old 영역

  • Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생
  • old 영역에 대한 가비지 컬렉터(Garbage Collection)을 Major GC 또는 Full GC라고 부릅니다.
  • Young에서 처리할 수 없을 정도로 큰 경우, 바로 Old Generation

Meta Space 영역

자바 8 이전 : Permanation 영역 - Heap 영역에 위치
자바 8 이후 : MetaSpace 영역 - Native Memory 영역에 위치

저장하는 데이터 : 자바의 메타 데이터

  • Class Meta Data
  • Method Meta Data
  • Static Object Variable

💡 PermGen 제거된 이유 ? ( = 단점 )

  • PermGen 영역이 고정 크기로 할당되어 있기 때문에, 할당 가능한 메모리 크기가 제한적
  • 클래스 메타데이터가 많아지면, PermGen 영역의 메모리 부족으로 인해 OutOfMemory(OOM) Error 가 발생!!!
  • PermGen 영역의 GC는 Full GC 를 수행하기 때문에, GC 가 길어집니다.

💡 이를 보완한 MetaSpace

  • Metaspace 영역은 JVM에 의해 관리되는 Heap이 아닌 OS 레벨에서 관리되는 Native Memory 영역
    • 운영체제가 메모리를 동적할당하는 방식으로 변경
  • 그러므로 Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 됨!
  • 메모리의 동적할당으로 이루어지기 때문에 메모리 단편화를 방지하기 위하여 블록 할당방식으로 변경되었으며 메타데이터의 정보는 힙과 네이티브 메모리 두 영역에 모두 할당

Q) Young/Old 영역을 나누는 이유?

Heap 영역은 처음 설계될 때 다음의 2가지 전재로 설계되었습니다.
1. 대부분의 객체는 금방 접근 불가능한 상태가 된다.
2. 오래된 객체에서 새로운 객체로의 참조는 아주 적개 존재한다.
즉, 객체는 대부분 일회성이며, 메모리에 오래 남아있는 경우가 드물기 때문에 생존 기간에 따라 객체를 효율적으로 관리하기 위해 나눕니다.

Q) static도 수거되나요?

null 선언 시 사용하지 않는 객체로 GC가 가능해집니다.

0개의 댓글