[모두가 기술 면접에 합격하는 그날까지]
https://github.com/Lee-Jin-Hyeok/technical-interview-question
JVM
에서는 Heap Area
의 메모리 관리를 위해서 Garbage Collector(이하 GC)
를 이용합니다.
이런 GC
도 종류가 있으며, 각각 동작 방식이 다릅니다.
GC
의 전체적인 동작 과정은 링크의 Runtime Data Area
의 Heap Area
항목을 보시면 될 것 같습니다.
GC
는 메모리 관리를 위해 Garbage Collection
동작을 하는데
이 과정에서 Garbage Collection
을 실행하는 스레드를 제외한 모든 스레드가 멈추는
Stop the world
현상이 일어나게 됩니다.
스레드가 멈춘다는 것은 곧 애플리케이션이 멈춘다는 뜻으로
서비스가 정상적으로 지속되는데 큰 영향을 줍니다.
그래서 Stop the world
로 인한 멈춤 현상을 최소화하기 위하여 새로운 GC
들이 개발되었습니다.
이런
Stop the world
의 멈춤 현상 최소화 과정을GC 튜닝
이라고 합니다.
GC
의 종류는 크게 다섯 가지로 나누어집니다.
초기 버전의 GC
로 Heap Area
를 Young Generation
, Old Generation
으로 나눠서
메모리를 관리하였습니다. 이 방법은 이후 세대에서도 계속 사용됩니다.
자세한 동작 과정은 위 링크를 통해 알 수 있습니다.
살아남을 객체를
표시(Mark)
하고 쓰레기 객체를정리(Sweep)
하며,
단편화를 없애기 위해압축(Compact)
한다고 해서
Mark-Sweep-Compact
알고리즘이라고 합니다.
Serial GC
는 초기 모델인 만큼 싱글 스레드로 Garbage Collection
을 수행합니다.
따라서 작업 속도가 느리고 멀티 프로세싱이 되는 하드웨어의 성능을 이용할 수 없습니다.
이름 그대로 Serial GC
가 싱글 스레드로 동작한다는 문제점을 해결하기 위해
Garbage Collection
을 멀티 스레드로 처리합니다.
단, Young Generation
영역에서 실행되는 Minor GC
만 멀티 스레드로 처리하고
Old Generation
영역에서 실행되는 Major GC
는 여전히 싱글 스레드로 처리합니다.
CMS GC
는 Garbage Collection
을 동작하는 동안 네 가지의 동작을 거칩니다.
Initial Mark
Stop the world
현상이 발생하지만Concurrent Mark
GC
와 애플리케이션의 리소스를 공유합니다.Remark
Stop the world
현상이 발생합니다.Concurrent Sweep
Sweep
하는 작업을 거칩니다.Stop the world
현상이 발생하지 않습니다.이렇게 애플리케이션을 거의 멈추지 않고 Garbage Collection
을 동작한다는 장점이 있지만,
GC
와 애플리케이션이 동시에 작동하여 메모리와 CPU
를 더 많이 잡아먹습니다.
또한 애플리케이션과 동시에 작동하는 바람에 Compact
작업을 거치지 않아,
큰 객체가 들어갈 공간을 확보하지 못할 수도 있습니다.
CMS
알고리즘을 적용하는 공간은Old Generation
영역이며,
Young Generation
영역에서는Parallel
알고리즘을 거의 그대로 사용합니다.
G1 GC
는 이전 GC
들 처럼 Young Generation
과 Old Generation
영역을 따로 구분짓지 않고
모두 1MB 크기의 리전(Region)
으로 나눕니다.
들어가는 객체가 젊은 객체면 그 리전은 Young Generation
으로 정해지고,
늙은 객체라면 그 리전은 Old Generation
으로 정해집니다.
하나의 리전이 가득차면 살아있는 객체를 다른 Old
또는 Young
영역으로 옮기고
리전에 남은 객체들은 모두 삭제합니다.
이런식으로 크지 않은 공간의 객체를 계속 지움으로써 Stop the world
현상은
많이 발생할 수 있으나, 그만큼 멈추는 기간이 짧기 때문에 더 큰 효율을 볼 수 있습니다.
또한 리전 별로 객체를 제거하기 때문에 단편화의 문제도 해결할 수 있습니다.
비교적 최근에 개발된 GC
로 G1 GC
보다 빠르고 효율적인 Garbage Collection
을 한다고 합니다.
정확한 것은 다음 링크에서 알아봐주세요.
[CMS GC - Initial Mark]
https://stackoverflow.com/questions/50323753/java-cms-gc-initial-mark