hyeonga_code

JVM_11_GC 알고리즘 힙의 세분화 Minor GC, Major GC, Mixed GC 본문

JVM

JVM_11_GC 알고리즘 힙의 세분화 Minor GC, Major GC, Mixed GC

hyeonga 2024. 5. 10. 05:59
반응형

 

 

JVM_17_GC 다시 알기 (수정사항)

1. GC 는 reachable 만 남기는 것GC 이름대로 unreachable이 중요한 것이 아니라 reachable한 객체를 어떻게 남기는 지가 중요한 것살아있는 객체를 어떻게 살릴것인지가 관건입니다.Oracle의 GC 개발자가 만

hyeonga493.tistory.com

GC

자동으로 자바의 메모리를 관리해주는 기술입니다. 개발자가 직접 메모리를 관리하지 않아도 되는 편리함이 장점으로 메모리 누수에 대해 걱정하지 않아도 됩니다.

그러나 GC가 언제 동작하는지 개발자가 알 수 없고, 애플리케이션 실행 중에 GC 스레드가 실행되어 애플리케이션이 중단될 수도 있다는 단점이 있습니다.

GC의 동작 방법에는 다양한 알고리즘을 활용한 메모리 회수 방법이 있습니다.

1. Mark and Sweep 알고리즘

객체들을 reachable 상태와 unreachable 상태로 구분해서 참조되고 있는 상태의 객체는 놔두고, 참조되지 않는 객체들이 차지하고 있는 메모리를 회수합니다.

reachable 상태는 root space에서 참조되고 있는 객체를 의미하며 reference count가 0이 아니어야 합니다.
unreachable 상태는 root space에서 참조되고 있지 않은 객체를 의미하며 reference count가 0인 객체입니다.

GC의 대상은 unreachable Object가 되며 GC 동작 시에 unreachable Object가 차지하고 있던 메모리를 회수합니다.

Mark and Sweep 알고리즘은 참조되고 있는 객체에 마킹하고, 마킹하지 않은 객체를 삭제하는 알고리즘입니다.

 

 


Root Space

힙 영역에 있는 객체들을 참조하고 있는 메모리 영역의 집합을 의미합니다.

객체 참조의 종류
 힙 내의 다른 객체에 의한 참조가 있는데 이를 순환참조라고 합니다. 이는 객체의 참조 상태를 판단짓는 기준에서 제외됩니다. Java 메소드 실행 시 사용하는 지역 변수와 파라미터들에 의한 참조와 JNI(Native Stack)에 의해 생성된 객체에 대한 참조, 그리고 메소드 영역의 정적 변수에 의한 참조애 대해 결정됩니다.

 

 

2. Mark Sweep Compact 알고리즘

mark and sweep 알고리즘에서 정렬되지 않은 조각으로 나뉘어 크기는 충분하지만 추가적으로 메모리 할당이 되기 힘든 상태를 의미하는 메모리 단편화가 발생하는 것을 해결할 수 있는 알고리즘입니다.
컴팩트 단계에서 메모리를 정리하여 메모리 단편화를 해결합니다.

 


메모리 단편화 Fragmentation

 RAM에서의 메모리 공간이 작은 조각으로 나뉘어 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 의미합니다. - 내부 단편화: 필요한 양보다 더 큰 메모리가 할당되어 사용하는 메모리 공간이 낭비되는 상황 - 외부 단편화: 사용하지 않는 메모리가 많아 총 메모리 공간이 충분하지만 실제로 할당할 수 없는 상황

 

힙 영역 세분화

 

GC가 효율적으로 동작할 수 있도록 힙 영역을 세분화합니다. Young 영역과 Old 영역으로 나눌 수 있고, Young 영역은 Eden 영역, Survivor 0 영역, Survivor 1 영역으로 나눌 수 있습니다.

힙 영역을 세분화한 이유에는 대부분의 객체가 금방 접근 불가능한 상태가 되고, 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재하므로 GC의 효율을 극대화하기 위함입니다.

 

그래서 Young 영역은 Old 영역보다 사이즈가 작고, 대부분의 객체가 Young 영역에서 메모리가 회수되도록 구현되어 있습니다. Young 영역에서 계속 살아남아 Old 영역으로 복사되는 과정을 `aging` 이라고 합니다.

Young 영역에서 발생하는 GC는 `Minor GC` 라고 하며, Old 영역에서 발생하는 GC는 `Major GC`라고 합니다.

 

Minor GC

 

Young 영역에서 발생하는 GC를 의미합니다.
작은 메모리 영역에 대해 GC가 동작하므로 비교적 빠른 시간 내에 GC 작업이 마무리가 됩니다.

Minor GC의 동작 방식
새로 생성된 대부분의 객체는 Young 영역의 `Eden 영역` 에 위치합니다.
첫 번째 GC가 발생하면 Eden 영역에서 살아남은 객체가 `Survivor 0 영역` 으로 이동합니다.
두 번재 GC가 발생하면 Eden 영역에서 살아남은 객체와 `Survivor 0 영역` 에서 살아남은 객체가 `Survivor 1 영역` 으로 이동하고 `Survivor 0 영역`이 리셋됩니다.
세 번째 GC가 발생하면 Eden 영역에서 살아남은 객체와 `Survivor 1 영역` 에서 살아남은 객체가 `Survivor 0 영역`으로 이동하고 `Survivor 1 영역` 이 리셋됩니다.

JVM의 설정 횟수 이상으로 Minor GC에서 살아남은 객체의 경우 Old 영역으로 이동합니다. 이를 Promotion이라고 합니다.
프로모션은 메모리의 효율적인 관리를 돕고, 자주 사용하지 않는 객체가 Young 영역에서 계속 공간을 차지하는 것을 방지합니다.

Major GC

 

Old 영역에서 발생하는 GC를 의미합니다.
Young 영역에 비해 큰 메모리 영역을 가지고 있어 소요되는 시간이 길어질 수 있습니다.
그래서 일반적으로 GC로 인한 성능 저하를 방지하기 위해서는 Major GC의 STW 시간을 줄이거나 빈도 수를 줄이는 방법을 사용합니다.

Major GC가 시작되면 JVM은 모든 스레드를 일시 중지합니다. `Stop-the-World` 시작
힙 전체를 안전하고 일관성 있게 검사/수정할 수 있도록 보장하기 위해 필요한 과정입니다.

힙에 존재하는 모든 객체를 검사하여 reachable 객체를 식별합니다. 이 단계에서 GC 루트에서 시작하여 참조를 따라가면서 접근 가능한 모든 객체를 마킹합니다.

마크된 객체를 제외한 모든 객체는 사용되지 않는 것을 의미하고 메모리에서 제거되어 공간을 회수합니다.

필요한 경우 메모리 단편화를 줄이기 위해, GC는 사용 중인 객체를 힙의 한 부분으로 이동시킬 수 있습니다. 연속적인 자유 메모리 공간을 확보하여 성능을 향상 시키도록 합니다.

과정이 종료되면 `Stop-the-World`를 종료시켜 애플리케이션이 정상적으로 동작하도록 합니다.

 


`Stop-the-World`가 발생하기 때문에 처리 시간이 길어질 수 있어 응답 시간이 늘어날 수 있습니다. `Stop-the-World`를 유발하기 때문에 사용자 경험이나 실시간 처리 요구 사항이 중요한 애플리케이션에서는 성능 문제가 될 수 있습니다.

 

 

Mixed GC

Young 영역과 Old 영역을 동시에 수집하며, 일부 라이브 객체만을 수집하여 Young 영역으로 이동하거나 Old 영역에서 제거합니다.
G1 GC에서 사용하는 고급 메모리 관리 방식입니다.
이는 일시 중지 시간이 짧고 최적화된 방식으로 Old 영역에 대한 GC 부담을 분산하고, 성능과 효율을 개선할 수 있습니다.

 


`Mixed GC` : 일부를 대상으로 GC가 동작
`Major GC` : 힙 전체를 대상으로 GC가 동작
`Minor GC` : Young 영역을 대상으로 GC가 동작

 

 

 

 

 

반응형