(Java) Garbage Collection

2022. 12. 29. 01:05Java

반응형

자바에는 아니 JVM에는 Garbage Collector(GC)가 있습니다.

 

GC의 역할은 Garbage Collection 즉, 쓰레기를 모으는 역할을 하는데요,

프로그래밍에서의 Garbage는 메모리가 될 것입니다.

 

즉, 동적으로 할당한 메모리 영역 중 더이상 사용되지 않는 영역을 탐지하여 해제하는 것이 바로 GC의 기능입니다.

 

 

그럼 동적으로 할당된 메모리는 무엇일까요?

 

그러려면 JVM의 구조에 대해서 알아야 합니다.

 

 

 

(Java) JVM 구조와 이해

오늘은 JVM의 구조에 대해서 적어보려 한다. 이전에 간략하게나마 JVM 구조에 대해 적은 것이 있으니 참고하는 것도 좋을거 같다. JAVA - JVM에 대해 알아보자 -1 Java에 대해 알고 있는가? 자바는 썬

mirrorofcode.tistory.com

 

JVM에 Runtime Data Area에는 총 5가지 영역이 존재하고 그 중 변수는 Method Area, Heap, Stack에 저장될 수 있습니다.

 

이 중에서 Stack에는 정적으로 할당한 메모리가 적재되는 곳으로 원시 타입의 데이터가 값과 함께 할당되게 되고,

Heap 영역에 생성된 Object 타입의 데이터의 참조 값이 할당되게 됩니다.

 

 

Heap 영역에는 동적으로 할당한 메모리가 적재되는 곳으로 모든 Object 타입의 데이터가 할당되게 됩니다.

 

stack 영역에 저장된 값은 메서드의 실행이 끝나는 즉시 비워지지만 Heap 영역은 그렇지 않고 Garbage Collection의 대상이 되게 됩니다.

 

 

Garbage Collection

Garbage Collection은 Mark&Sweep이라는 두 가지 동작으로 진행됩니다.

 

Mark는 변수와 변수를 참조하고 있는 객체를 마킹하는 동작입니다.

그렇기 때문에 Stack 영역, Heap 영역에서 모두 발생합니다.

 

먼저 Stack 영역의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹을 합니다.

이후 Heap 영역에서 Stack의 변수가 참조하고 있는 변수를 찾아 마킹합니다.

 

그리고 마지막으로 마킹 되지 않은 객체를 Heap에서 제거하는데 이 과정이 바로 Sweep 입니다.

 

 

GC의 실행

Garbage Collector는 사용자가 동작시키는 것이 아닌 JVM에 의해서 동작합니다.

그럼 언제 GC가 동작할까요?

 

언제 동작하는지 알기 위해서는 Heap의 구조를 알아야 합니다.

Java8 이전의 Heap
Java 8이후의 Heap

 

위에 보이는 사진이 바로 Heap의 구조입니다.

 

참조형 객체가 선언되면 가장 처음 Eden에 할당되게 됩니다.

 

그리고 Eden이 꽉 차게 되면 GC가 실행되게 됩니다.

이때, 살아남은 참조형 메모리는 S0(Survivor 0)로 옮겨지게 되고, 이 동작을 Promotion이라고 합니다.

 

 

유추가 되셨겠지만, 각 영역이 꽉 찼을 때 GC가 동작하게 됩니다.

 

 

메모리 영역이 꽉 찼을때 GC가 동작하는 것은 같지만 각 영역에서 동작하는 Garbage Collection은 조금 다릅니다.

 

Young Generation에서 동작하는 GC를 Minor GC라고 하고, Old Generation에서 동작하는 GC는 Major GC라고 합니다.

 

 

 

Minor GC vs Major GC vs Full GC | Plumbr – User Experience & Application Performance Monitoring

Do you know what differentiates Minor GC, Major GC and Full GC events within the JVM? Is this separation even necessary? The post busts some myths about the GC behavior while explaining the way GC…

plumbr.io

 

 

GC의 종류

GC에는 대표적으로 4가지 종류가 있습니다.

 

  • Serial GC
  • Parallel GC
  • Concurrent mark sweep gc(CMS GC)
  • G1GC

다음 문서에서 자세하게 설명하겠지만, 이 문서에서 간단히 설명하자면

 

SerialGC는 GC를 실행하는 스레드가 하나만 있는 GC를 말합니다.

Mark-Compact collection 알고리즘을 사용해서 Garbage collection을 수행합니다.

성능이 좋진 않겠죠?

 

Parallel GC는 스레드가 여러개 있는 GC입니다.

Serial GC보다 좋은 성능을 보여줍니다.

 

CMS GC)는 

STW(Stop the world)의 시간을 줄인 GC입니다.

Serial GC의 경우 STW에 Mark&Sweep을 진행하지만

 

CMS GC는 스레드 실행 중에 Mark를 하고 STW 중 Remark, 그리고 스레드를 실행하면서 

동시에 Sweep을 하는 방식으로 Garbage Collection을 수행합니다.

 

마지막 G1GC는 각 영역을 바둑판 형식으로 나누어서 여러 스레드가 관리하게 합니다.

자바 9버전 부터 기본 GC로 설정되었고, 그만큼 성능이 좋습니다.

G1GC는 자세한 설명이 필요하기에 다음으로 미루겠습니다.

 

 

 

 

 

 

 

 

 

 

 

반응형