클라우드 낚시꾼

[JAVA] STW(Stop-The-World) 문제와 발생 이유 본문

Programming Language/JAVA

[JAVA] STW(Stop-The-World) 문제와 발생 이유

KanuBang 2024. 11. 13. 15:42
728x90

STOP THE WORLD란?

Stop the world

 

STW란 GC가 가비지 컬렉션을 수행하는 동안에 모든 어플리케이션 스레드를 중단하는 하는 것을 의미한다. STW로 인하여 모든 어플리케이션 스레드가 멈춰 모든 어플리케이션이 중단된다.


STOP THE WORLD의 단점

 

1. 중단 시간

 

가비지 컬렉션 과정 중에 모든 프로그램이 일시 중단되어 응답 시간이 길어져 사용자 경험이 저하되는 현상이 발생한다. 특히, 실시간성이 중요한 시스템에서 이는 큰 문제가 된다.

 

2. 가비지 컬렉션 오버헤드

 

가비지 컬렉션 오버헤드 시간이 길어지면 이 작업을 수행하기 위한 추가적인 시간과 리소스가 소비된다.


STOP THE WORLD가 발생해야 하는 이유

GC는 객체의 참조 상태를 기반으로 메모리 회수 여부를 결정한다. 이때, 만약 모든 어플리케이션 스레드가 실행 중이라면, 객체의 참조 상태가 계속 변하여 GC가 정확히 가비지를 수집하기 어렵다. 그렇기에, 가비지 컬력센을 수행할 때는 모든 어플리케이션 스레드를 중단시켜(STW) 안전한 상태에서 객체의 참조 상태를 파악하는 것이 중요하다.


STOP THE WORLD가 없다면 발생하는 문제:  본질은 객체 참조의 비일관성

STOP THE WORLD가 발생하는 이유는 객체 참조의 일관성을 위함이다. 즉, STOP THE WORLD가 없을 때 발생하는 문제들의 대부분은 객체 참조의 비일관성이다.

  • GC가 어떤 객체를 unreachable로 간주하려는 순간 다른 어플리케이션 스레드에서 그 객체를 참조하게 된다면, 정확한 가비지 수집이 어렵다.
  • GC가 root를 탐색하는 동안 다른 어플리케이션 스레드에서 root의 상태를 변화시키기 된다면, 정확한 가비지 수집이 어렵다.
  • mark and sweep의 compact 과정 중에 다른 어플리케이션 스레드가 실행 중인 상태에서 GC가 객체를 이동시킨다면, 객체의 참조가 잘못 되거나 메모리가 충돌되는 현상이 발생할 수 있다.

728x90