And Brain said,

Garbage Collector Stop-The-World(STW), 더 월드! 본문

IT/CS

Garbage Collector Stop-The-World(STW), 더 월드!

The Man 2023. 5. 11. 15:44
반응형

https://theworldaswillandidea.tistory.com/151

Garbage Collector, 프로그래밍 시스템의 스캐빈저

오늘은 프로그래머의 뒤처리를 담당해 주는 가비지 컬렉터(Garbage Collector, GC)에 대해서 알아보도록 합시다. 메모리 관리 방법 중 하나인 가비지 컬렉션(Garbage Collection)은 프로그래머가 동적으로

theworldaswillandidea.tistory.com

 
가비지 컬렉터(Gabage Collector)에 관한 주요 내용은 위 포스팅으로,
 
Stop-the-world (이하, STW)는 가비지 컬렉터가 자신을 제외한 모든 쓰레드를 중단시키는 것을 말합니다. 즉, 가비지 컬렉터는 가비지 컬렉션을 제외한 모든 애플리케이션을 멈춥니다.

 
이는 애플리케이션이 멈추어야 현재 메모리 상에서 살아있는 객체를 정확히 식별할 수 있기 때문입니다. 즉, STW는 메모리 참조 관계가 꼬이지 않게 하기 위한 일종의 안전장치인 셈입니다.
 
STW의 주요 과정은 대체로 아래와 같습니다.

1. 프로그램 일시 중단 : 가비지 컬렉션을 시작하기 전에, 가비지 컬렉터는 프로그램 실행을 일시 중단시키고, 모든 스레드를 정지시킵니다. 이렇게 함으로써 가비지 컬렉션 도중에 객체 참조 관계가 변경되는 것을 방지하여 메모리 관리를 안전하게 수행할 수 있습니다.

2. 루트 객체 식별 : 프로그램이 일시 중단된 상태에서 가비지 컬렉터는 루트 객체를 식별합니다. 루트 객체는 전역 변수, 스택에 있는 변수, CPU 레지스터에 저장된 객체, 스레드 별 로컬 변수 등 메모리 관리 시스템이 직접 접근할 수 있는 객체들입니다.

3. 객체 탐색 및 마킹 : 가비지 컬렉터는 루트 객체로부터 시작하여 참조되는 모든 객체를 재귀적으로 탐색하며, 방문한 객체에 '마크'를 합니다. 이 과정을 통해 접근 가능한 객체들이 식별됩니다. 객체 간의 참조 관계를 따라가며 이루어지기 때문에 이 과정이 완료되면 어떤 객체가 사용 중인지, 어떤 객체가 가비지인지를 알 수 있습니다.

4. 가비지 처리 : 마킹 과정이 끝난 후, 가비지 컬렉터는 마크되지 않은 객체들을 메모리에서 해제합니다. 이러한 객체들은 프로그램에서 접근할 수 없는 상태이기 때문에 안전하게 해제할 수 있습니다.

5. 프로그램 재개 : 가비지 컬렉션 작업이 완료되면, 가비지 컬렉터는 프로그램 실행을 재개시키고 모든 스레드를 다시 실행합니다. 이 시점부터 프로그램은 정상적으로 작동하며, 새로운 메모리 요청을 처리할 수 있습니다.

 
다음은, STW를 통해 얻는 장단점을 좀 더 자세히 살펴봅시다.
 

장점 -

안전성: 프로그램이 일시 중단되기 때문에, 가비지 컬렉션 도중 객체 참조 관계가 변경되지 않아 메모리 관리를 안전하게 수행할 수 있습니다.

순환 참조 해결: 트레이싱 기반 가비지 컬렉션 방식을 사용하기 때문에, 참조 카운팅에서 발생하는 순환 참조 문제를 해결할 수 있습니다.

완전성: 프로그램이 일시 중단되기 때문에, 모든 메모리 영역을 검사하여 접근할 수 없는 객체를 정확하게 식별하고 메모리에서 해제할 수 있습니다.


단점 -

중단 시간: 가비지 컬렉션 과정 중 프로그램이 일시 중단되어 실행이 멈추는 시간이 발생합니다. 이로 인해 애플리케이션의 응답 시간이 길어질 수 있고, 사용자 경험이 저하될 수 있습니다. 특히 실시간성이 중요한 시스템에서는 STW 방식의 가비지 컬렉션으로 인한 지연이 큰 문제가 될 수 있습니다.

가비지 컬렉션 오버헤드: STW 방식은 프로그램이 중단되는 시간이 필요하므로, 가비지 컬렉션 작업에 많은 오버헤드가 발생할 수 있습니다. 이 오버헤드는 애플리케이션의 성능에 영향을 미칠 수 있습니다.

 
최근에는 가비지 컬렉터의 STW 시간을 최소화하기 위해 여러가지 최적화 방법이 시도되는 중인데, 여기서는 대표적인 몇 가지만 살펴봅시다.
 

Generational Collection

객체 생성: 프로그램이 실행되면서 새로운 객체가 생성됩니다. 이때 모든 객체는 초기에 젊은 세대(young generation)에 할당됩니다. 젊은 세대는 일반적으로 Eden 영역, Servivor 영역 1, Servivor 영역 2로 구성됩니다. 새로 생성된 객체들은 Eden 영역에 할당됩니다.

젊은 세대 가비지 컬렉션: 젊은 세대의 메모리가 가득 차게 되면 가비지 컬렉션이 발생합니다. 이 과정에서 살아있는 객체들은 Servivor 영역 1로 이동하게 됩니다. 이후 가비지 컬렉션이 다시 발생하면 Servivor 영역 1의 객체들 중 살아있는 객체들은 Servivor 영역 2로 이동하게 됩니다. 이러한 과정이 반복되면서 살아남은 객체들은 오래된 세대(old generation)로 승격(promotion)됩니다.

오래된 세대 가비지 컬렉션: 오래된 세대의 메모리가 가득 차면 오래된 세대의 가비지 컬렉션이 발생합니다. 이 과정에서 살아있는 객체들은 그대로 유지되고, 사용하지 않는 객체들은 메모리에서 해제됩니다. 오래된 세대의 가비지 컬렉션은 젊은 세대의 가비지 컬렉션보다 덜 자주 발생하며, 처리 시간이 좀 더 길어질 수 있습니다.

메모리 정리 및 재활용: 오래된 세대에서 가비지 컬렉션이 완료되면, 메모리가 정리되고 재활용됩니다. 이 과정을 통해 더 이상 사용되지 않는 메모리 공간이 회수되어, 새로운 객체들을 위한 공간이 확보됩니다.

 
Generational 가비지 컬렉션의 핵심 개념은 대부분의 객체가 빠른 시간 내에 해제될 것이라는 가정에 기반하여 젊은 세대에서 가비지 컬렉션을 더 자주 수행함으로써 전체 가비지 컬렉션 시간을 줄입니다. 이 방식은 오래된 세대의 가비지 컬렉션이 덜 자주 발생하도록 함으로써 전체적인 가비지 컬렉션의 오버헤드를 줄일 수 있는 장점을 가지고 있습니다.

그러나 이 접근 방식의 단점은, 추가적인 메모리 오버헤드가 발생할 수 있으며, 복잡한 알고리즘을 사용해야 한다는 것입니다. 또한 객체 이동 오버헤드가 발생하며, 세대별 튜닝이 필요하게 됩니다. 이러한 단점들로 인해, 프로그램의 성능에 영향을 줄 수 있습니다.
 
 

Incremental Collection

작업 분할: 가비지 컬렉션 작업은 여러 작은 단계로 분할됩니다. 각 단계는 빠른 시간 내에 완료될 수 있도록 설계되어야 합니다.

가비지 컬렉션 단계 실행: 프로그램 실행 중, 일정 시간마다 가비지 컬렉션 작업을 실행합니다. 이때 가비지 컬렉션의 작은 단계들이 순차적으로 수행됩니다.

중단 시간 최소화: 각 가비지 컬렉션 단계가 빠른 시간 내에 완료되도록 함으로써, 프로그램이 일시 중단되는 시간을 최소화합니다.

작업 완료 및 정리: 모든 가비지 컬렉션 단계가 완료되면, 메모리 정리 및 재활용이 수행됩니다.

 
Incremental Collection 은 가비지 컬렉션 작업을 여러 작은 단계로 분할하여 중단 시간을 최소화하는 방식입니다. 이 방식은 각 단계가 빠른 시간 내에 완료되도록 설계되어, 프로그램이 일시 중단되는 시간이 상대적으로 짧아지는 장점이 있습니다.

그러나 이 접근 방식에도 단점은 존재하는데, 가비지 컬렉션의 전체 시간이 길어질 수 있는 트레이드 오프가 있다는 것입니다. 작업을 여러 단계로 분할하면 각 단계마다 약간의 오버헤드가 발생하며, 이로 인해 전체적인 가비지 컬렉션 작업 시간이 늘어날 수 있습니다. 또한, 이 방식은 구현이 복잡하고, 세부적인 튜닝이 필요할 수 있어 프로그램의 성능에 영향을 줄 수 있습니다.
 
 

Parallel Collection

가비지 컬렉션 시작: 가비지 컬렉션 작업이 시작됩니다. 이때, 여러 개의 스레드가 가비지 컬렉션 작업을 동시에 처리하기 시작합니다.

루트 객체 식별: 각 스레드는 루트 객체를 식별합니다. 이 작업은 병렬적으로 수행되므로 처리 시간이 줄어듭니다.

객체 그래프 탐색: 각 스레드는 루트 객체부터 시작하여 객체 그래프를 탐색하며, 살아있는 객체를 찾습니다. 이 과정 역시 병렬적으로 수행되므로 처리 시간이 단축됩니다.

불필요한 객체 회수 및 메모리 정리: 각 스레드는 살아있는 객체를 제외한 나머지 객체들을 메모리에서 회수하고, 메모리를 정리합니다. 이 작업도 병렬적으로 수행되어 처리 시간이 줄어듭니다.

 
병렬 수집 방식은 멀티코어 프로세서에서 효과적이며, 가비지 컬렉션 작업의 오버헤드를 줄이는 데 도움이 됩니다. 여러 스레드가 동시에 작업을 수행하므로, 가비지 컬렉션 작업 시간이 크게 줄어들 수 있습니다.

그러나 병렬 처리를 위한 추가적인 리소스가 필요하며, 동기화 문제를 고려해야 합니다. 여러 스레드가 동시에 메모리 영역에 접근하게 되면, 데이터 일관성을 유지하기 위해 동기화가 필요하며, 이로 인해 프로그램의 성능에 영향을 줄 수 있습니다. 또한, 병렬 처리 과정에서 발생하는 오버헤드 역시 고려해야 합니다.
 
 

Concurrent Collection

가비지 컬렉션 시작: 애플리케이션 실행 중에 가비지 컬렉션 작업이 시작되며, 별도의 스레드에서 실행됩니다.

루트 객체 식별 및 객체 그래프 탐색: 가비지 컬렉션 스레드는 루트 객체를 식별하고, 객체 그래프를 탐색하여 살아있는 객체를 찾습니다. 이 과정은 애플리케이션과 동시에 진행되므로 중단 시간이 최소화됩니다.

애플리케이션과 상호 작용: 가비지 컬렉션 스레드와 애플리케이션 스레드는 서로 상호 작용하며, 객체들의 상태 변경에 따라 적절하게 처리됩니다. 이 과정에서 동기화 문제를 주의해야 합니다.

불필요한 객체 회수 및 메모리 정리: 가비지 컬렉션 스레드는 살아있는 객체를 제외한 나머지 객체들을 메모리에서 회수하고, 메모리를 정리합니다.

 
이 방식의 가장 큰 장점은 중단 시간을 최소화하여 애플리케이션의 반응성을 높이는 것입니다. 이로 인해 사용자 경험이 좋아질 수 있습니다.
 
그러나 동시 수집 방식의 단점으로는 동기화 문제에 신경을 써야하고, 가비지 컬렉션의 처리 시간이 길어질 수 있다는 점입니다. 또한, 이 방식은 애플리케이션의 복잡성이 증가할 수 있습니다.
 
 

Adaptive Collection

프로그램 실행 및 모니터링: 프로그램이 실행되면서 가비지 컬렉터는 프로그램의 메모리 사용 패턴과 동작을 모니터링합니다. 이를 통해 가비지 컬렉션 전략을 최적화할 수 있는 정보를 수집합니다.

가비지 컬렉션 전략 결정: 모니터링을 통해 수집된 정보를 바탕으로, 가비지 컬렉터는 어떤 가비지 컬렉션 전략이 가장 효과적인지를 결정합니다. 이때, 젊은 세대와 오래된 세대의 크기, 가비지 컬렉션 빈도, 가비지 컬렉션 알고리즘 등 여러 요소를 고려합니다.

가비지 컬렉션 수행: 결정된 전략에 따라 가비지 컬렉션 작업이 수행됩니다. 프로그램의 실행이 계속되면서 가비지 컬렉션 전략은 지속적으로 조절되고 최적화됩니다.

 
적응적 수집의 장점은 가비지 컬렉션 전략이 프로그램의 동작과 메모리 사용 패턴에 맞게 최적화되어, 전체적인 프로그램 성능 향상과 가비지 컬렉션 오버헤드를 줄일 수 있다는 점입니다.
 
그러나 이 방식의 단점으로는 적응적 수집 알고리즘의 복잡성과 모니터링에 따른 추가적인 오버헤드가 발생할 수 있다는 점입니다.
 
 

G1(Garbage-First)

영역 분할: 메모리를 여러 동등한 크기의 영역으로 분할합니다. 각 영역은 젊은 세대, 오래된 세대, 또는 Survivor 영역으로 사용될 수 있습니다.

Garbage-First 원칙: 가비지가 많은 영역을 우선적으로 처리합니다. 이를 통해 가장 효율적인 가비지 컬렉션을 수행할 수 있습니다.

동시성 및 병렬 처리: G1 가비지 컬렉터는 동시성과 병렬 처리를 모두 활용하여 가비지 컬렉션 작업을 빠르게 수행합니다.

적응성: G1 가비지 컬렉터는 프로그램의 동작과 메모리 사용 패턴에 맞게 가비지 컬렉션 전략을 동적으로 조절합니다.

 
 G1 가비지 컬렉터는 여러 기존 가비지 컬렉션 전략들의 장점을 결합한 알고리즘으로, 높은 처리량과 낮은 중단 시간을 동시에 달성하려는 목표를 가지고 있지만, 알고리즘의 복잡성과 추가 리소스 사용으로 인해 일부 상황에서 오버헤드가 발생할 수 있습니다. 그럼에도 불구하고, G1 가비지 컬렉터는 많은 최신 JVM에서 기본 가비지 컬렉터로 사용되고 있습니다.
 
 

끝으로,

이렇게 STW가 무엇인지 그 과정과 STW 시간을 최소화하기 위한 여러 전략을 살펴보았습니다. 이밖에도 STW 시간을 줄이기 위한 여러 전략과 알고리즘이 존재하므로, 여러가지 가비지 컬렉터 튜닝에 대해 더 학습해보시길 바랍니다.
 
 

Thanks for watching, Have a nice day.

 
 

References

https://d2.naver.com/helloworld/1329
https://velog.io/@sweet_sumin/stop-the-world%EB%8A%94-%EC%99%9C-%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%BC%EA%B9%8C

반응형
Comments