현재 진행중인 굿즈 포유 프로젝트는 JDK 17 버젼을 사용하고 있습니다.
문득 프로젝트를 진행하던 중, 현재 사용하는 GC는 무엇이며 어떤 장점과 단점이 있고 내부적으로 어떻게 동작할까에 대해 의문이 들어 이 글을 작성하게 되었습니다.
➕ JDK 17버전을 기준으로 사용중인 CPU가 1개면 Serial GC가 실행되고, CPU가 2개 이상이라면 G1 Gc가 실행됩니다.
위 두가지 GC중 G1 GC에 집중해서 알아보도록 하겠습니다.
Garbage Collection에 대해 알아보기전에 중요한 키워드는 stop-the-world 입니다. stop-the-world란, GC를 실행하기 위해 JVM이 애플리케이션 실행을 잠시 멈추는 것 입니다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈추게 됩니다.(그렇기 때문에 더 이상 작업이 실행되지 않고, 성능이 저하되게 됩니다. 그래서 JVM 튜닝시 적절한 빈도의 GC가 실행되도록 하여, Stop-the-World 시간을 줄여 쓰레드가 정지되는 시간을 줄이는 것이 중요합니다)
G1 GC
G1(Garbage First) GC는 가상의 바둑판 모양의 영역에 객체를 할당하고 GC를 실행합니다. 그러다, 해당 영역이 꽉 차게 되면 다른 영역에서 객체를 할당하고 GC를 실행합니다.
G1 GC는 힙 메모리 전체를 탐색하는 것이 아닌 영역(region)별로 나눠 탐색하고 영역별로 GC가 일어납니다. 예를 들어 파란색 블록이 eden영역이라 하면, G1GC가 eden영역이 4개 모여있는 영역을 확인하면 해당 영역을 우선적으로 GC합니다. 이러한 Garbage Collection 방식 때문에 Garbage First Collection이라고 이름이 지어졌기도 합니다.
또한 G1 GC는 더 효율적이라고 생각되는 위치로 객체를 재할당(Reallocate)시킵니다.(예를 들어
G1GC 이전의 GC 들은 Young Generation에 있는 객체들이 GC가 동작할때마다 살아남으면 해당 객체를 Eden → Survivor0 → Survivor1 순으로 이동시켰지만, G1GC는 Survivor1(s1)영역에 있는 객체가 Eden 영역으로 가는 것이 더 효율적이라고 판단되는 경우 Eden 영역으로 이동시킵니다.)
참고 자료
'프로그래밍 > Java' 카테고리의 다른 글
Java volatile이란? (0) | 2023.09.08 |
---|---|
함수형 프로그래밍 (0) | 2023.04.11 |
Singleton 패턴과 스프링에서는 Singleton 패턴을 어떻게 사용하고 있을까? (0) | 2023.01.27 |
Long 과 AtomicLong은 어떤 차이가 있을까? (0) | 2023.01.24 |
ConcurrentHashMap은 어떻게 동시성 문제를 해결할까? (0) | 2023.01.24 |