코딩항해기

[리뷰/우아한테크] Garbage Collector 본문

IT tech

[리뷰/우아한테크] Garbage Collector

miniBcake 2024. 10. 25. 14:24

 

[10분 테코톡] 주디의 Garbage Collector

 

 

GC (Garbage Collector)

C,C++에서는 코드레벨에서 메모리를 할당 받고, 해제하는 작업이 필요했다. 실수하면 Memory Leak가 발생할 수 있고, 번거로운 일이었다. 반면 JAVA에서는 GC가 Heap 메모리에서 unreachable한 객체를 삭제해 관리한다. 코드레벨의 메모리 관리에서 벗어났기 때문에 직접 관리할 필요가 없어 편리하다.

 

 

GC 장단점

장점

  • Memory Leak 발생할 일이 없다.
  • 휴먼 에러 발생 가능성을 낮춘다. (해제된 memory에 접근, 또는 이중 해체 등이 있다)

단점

  • 성능 저하가 있다. (어떤 메모리를 해제해야하는지 검사하고 삭제하는 과정 또한 자원과 메모리를 필요로 한다.)
  • 개발자가 언제 메모리가 해제되는지 알 수 없다. (jvm이 GC를 실행하기 위해 application 실행을 잠시 정지하는데 실시간성이 매우 강조되는 프로젝트의 경우에는 단점이 될 수 있다.)

 

JVM의 GC Algorithms : Mark and Sweep

Mark

: root set으로부터 Heap 영역의 모든 객체를 스캔

Sweep

: root set에서 unreachable한 객체를 Heap영역에서 제거

 

 

Mark and Sweep의 2가지 특징

1. 의도적으로 GC를 실행한다.

: jvm의 기준에 따라 GC을 실행하며 이 기준을 알기 위해서는 jvm의 Heap영역을 확인해야한다.

 

 

Young generation과 Old generation

Heap메모리는 크게 Young generation(새로운 객체 할당)과 Old generation(오랫동안 살아남은 객체)으로 나뉜다. Heap메모리를 매번 전체 다 검사하는 것보다는 할당된지 얼마 안된 객체들을 주기적으로 스캔하는 게 훨씬 효율적이며 비용을 줄일 수 있기 때문이다. (오래된 객체에서 젊은 객체로의 참조는 거의 없고 할당된 객체는 금방 garbage 상태가 되기 때문이다.)

 

Young generation

Young generation 영역은 다시 분리되는데 그 중 Eden이라는 공간에 먼저 들어가게 되며, 이 Eden에 객체가 전부 할당되면 minor GC가 실행되어 mark and sweep가 진행된다. root로부터 reachable이라 판단된 객체는 survival 0영역으로 옮겨지며 age-bit가 1 증가하게 된다. age-bit가 특정 숫자까지 도달하면 오래 살아남은 객체로 여겨져 Old generation 영역으로 옮겨진다.

(다시 Eden이 차면 minor GC가 실행되고 Survival 0에서 다시 살아남은 객체는 Survival 1으로 옮겨지며 age-bit가 증가한다)

 

Old generation

major GC가 해당 영역을 관리하며 더 오래걸린. generation이 전부 사용되면 그 때 검사가 이뤄지며 mark and sweep를 사용한다.

 

 

2. application실행과 GC실행이 병행된다.

(Heap 영역은 GC에 의해 관리되는 영역으로 Heap 영역에서 mark and sweep가 이뤄진다.)

실제로 병행되는 것은 아니며 jvm은 GC를 실행하기 위해 Application의 실행을 멈추는데 (stop the world)이 stop the world 시간이 짧을 수록 최적화된 것이다. 최적화를 위해 여러 방식을 사용하고 있다.

 

Parallel GC

java 8에서 기본적으로 사용되는 GC방식으로 multi core환경에서 사용된다. 여러 개의 thread로 GC를 실행하기 때문에 stop the world 시간이 짧다 (최적화)

 

G1 GC

java 9부터 기본적으로 쓰이는 GC방식으로 heap을 일정 크기의 region으로 잘게 나눠서 (young, old) 활용한다. 이 때 region은 개수를 알아서 튜닝해주기 때문에 stop the world 시간을 줄일 수 있다.