soowanlog

Garbage Collector 본문

백엔드/Java

Garbage Collector

개발자솬
백엔드/Java

Garbage Collector

개발자솬 2024. 3. 7. 15:05
728x90
반응형
  • Garbage Collector(GC)란?

GC는 JVM의 heap 영역에 할당한 메모리 중 사용하지 않는 메모리를 자동으로 수거하는 기능을 말합니다. C/C++ 같은 언어는 메모리를 할당하고 직접 해제해야 했지만, Java는 GC를 이용하여 개발자들이 메모리 관리를 비교적 신경 쓰지 않아도 됩니다.

 

  • JVM heap 영역

GC의 동작 방법을 이해하기 앞서 JVM의 heap 영역 구조를 이해해야 합니다. heap 영역은 크게 Young 영역과 Old 영역으로 메모리를 구분합니다.

영역 설명
New/Young 영역 - 객체가 생성되자마자 저장되고 생긴지 얼마 안 된 객체가 저장되는 곳.
- 시간이 지남에 따라 우선 순위가 낮아지면 Old 영역으로 옮겨짐.
Old 영역 - New/Young 영역에서 저장되었던 객체 중에 오래된 객체가 이동되어 저장되는 영역.
Perm 영역
(java 8 이후 삭제, Metaspace 추가)
- 코드가 저장되는 영역.
- JVM에 의해서 사용됨.

 

※ Perm 영역이 삭제된 이유



- Perm 영역


기존에 Perm 영역 크기로 인한 java.lang.OutOfMemoryError(OOME)가 발생하는 경우가 많았음.
Perm 영역은 static 변수, 메소드의 메타데이터 등 객체의 생명주기가 영구적일 것으로 생각되는 객체들을 관리함.
이 영역은 GC 대상에서 제외되고 주로 Java의 Class들이나 문자열에 속한 String들이 위치함.
이러한 객체들을 로드 할 때 연관된 다른 객체들도 같이 로드되며 Perm 영역에 할당되는데 이러한 객체들이 코딩 실수로 여러개 생성되어 Perm 영역에서 자리를 많이 차지하여 OOME가 발생함.

그래서 Perm 영역에서 관리하던 것들을 JVM에서 관리하는 Heap 영역이 아닌 Native Memory로 옮기게 됨.

static 변수는 Heap 영역으로 옮겨져서 GC의 대상이 됨.

-Metaspace


Metaspace에서는 Class 구조, Method 정보, Exception 정보, Bytecode, Constant Pool, Annotation 등 클래스 로더가 런타임 중 읽어온 정보가 저장됨.

Heap 영역은 JVM에 의해 관리되지만 Native Memory 영역은 OS에 의해 관리되는 영역임.
Native Memory 영역에 있는 Metaspace는 OS가 자동으로 크기를 조절하기 때문에 개발자가 영역 확보를 의식할 필요가 없게 되어 OOME가 발생하기 어려움.

 

- Minor GC

New/Young 영역을 Minor GC라고 부릅니다. 또 New/Young 영역은 Eden/Survivor 영역으로 나뉘게 됩니다.

 

Eden 영역은 객체가 생성되자마자 저장되는 곳이고 이렇게 생성된 객체는 Minor GC가 발생할 때 Survivor 영역으로 이동하게 됩니다.

 

Survivor 영역은 다시 Survivor1과 Survivor2 영역으로 나뉘는데, Minor GC가 발생하면 Eden과 Survivor1 영역에 있는 활성 객체를 Survivor2 영역으로 이동시킵니다.

 

다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2 영역에 있는 활성 객체를 Survivor1 영역으로 이동시킵니다.

 

이렇게 계속해서 Minor GC를 수행하다가 Survivor 영역에서 오래된 객체는 Old 영역으로 옮겨지게 됩니다.

 

이러한 방식의 GC알고리즘을 Copy & Scavenge라고 하는데 이 방식은 속도가 매우 빠르며 작은 크기의 메모리를 Collecting 하는데 매우 효과적입니다.

 

- Major GC(Full GC)

Old 영역에서 발생하는 GC를 Major GC 또는 Full GC라고 부릅니다.

 

객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시합니다. 이 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 표시된 객체를 삭제합니다.

 

이러한 방식의 GC알고리즘을 Mark & Compact라고 합니다.

 

Major GC는 속도가 매우 느리며, Major GC가 일어나는 도중에는 순간적으로 Java API가 멈춰버리기 때문에 Major GC가 일어나는 정도와 시간을 API의 성능과 안정성에 아주 큰 영향을 미칩니다.

 

참    고    자    료

- GC(Garbage Collector) 종류 및 내부 원리 | dongwooklee96.github.io

 

- GC란 무엇인가? | goswungwon.log

 

- Java - Perm 영역이 Metaspace로 바뀐 이유![+ Heap Area, Native Memory 차이] | JaeHoney

728x90
반응형

'백엔드 > Java' 카테고리의 다른 글

Servlet  (2) 2024.04.01
JVM  (0) 2024.03.08
Java 버전 별 특징  (2) 2024.03.07
Java  (0) 2024.03.07
JDBC  (0) 2024.03.06