본문으로 건너뛰기

크롬을 위한 한 걸음, V8을 위한 거대한 도약

· 약 2분
힙의 수호자들 울란 데겐바예프, 하네스 파이어, 미카엘 립파우츠, 그리고 DevTools 전사 알렉세이 코지야틴스키

V8은 힙 크기에 대해 하드 제한을 가지고 있습니다. 이는 메모리 누수를 가진 애플리케이션에 대한 안전장치 역할을 합니다. 애플리케이션이 이 하드 제한에 도달하면, V8은 일련의 최후의 쓰레기 수집을 수행합니다. 쓰레기 수집이 메모리를 해제하는 데 도움이 되지 않으면, V8은 실행을 중지하고 메모리 부족 실패를 보고합니다. 하드 제한이 없다면, 메모리 누수가 있는 애플리케이션이 시스템 메모리를 모두 사용하여 다른 애플리케이션의 성능에 악영향을 미칠 수 있습니다.

아이러니하게도 이 안전장치 메커니즘은 JavaScript 개발자들에게 메모리 누수를 조사하는 것을 더 어렵게 만듭니다. 개발자가 DevTools에서 힙을 검사하기도 전에 애플리케이션이 메모리 부족 상태가 될 수 있습니다. 게다가 DevTools 프로세스 자체도 일반적인 V8 인스턴스를 사용하기 때문에 메모리가 부족할 수 있습니다. 예를 들어, 이 데모에서 힙 스냅샷을 찍는 것은 현재 안정적인 크롬에서 메모리 부족으로 인해 실행이 중단됩니다.

역사적으로 V8 힙 제한은 여유 공간을 두고 부호 있는 32비트 정수 범위에 맞게 편리하게 설정되었습니다. 시간이 지나면서 이 편리함은 V8의 타입이 다양한 비트 폭을 혼합하여 코드를 부주의하게 작성하는 결과를 초래했고, 제한을 증가시키는 능력을 사실상 깨뜨렸습니다. 최근 우리는 쓰레기 수집기 코드를 정리하여 더 큰 힙 크기를 사용할 수 있도록 했습니다. DevTools는 이미 이 기능을 활용하고 있으며, 이전에 언급된 데모에서 힙 스냅샷을 찍는 것이 최신 크롬 카나리에서 예상대로 작동합니다.

우리는 또한 애플리케이션이 메모리가 거의 소진되었을 때 애플리케이션을 중지할 수 있는 기능을 DevTools에 추가했습니다. 이 기능은 짧은 시간에 많은 메모리를 할당하게 하는 버그를 조사하는 데 유용합니다. 최신 크롬 카나리에서 이 데모를 실행하면, DevTools는 메모리 부족 실패 전에 애플리케이션을 중지하고 힙 제한을 늘려 사용자가 힙을 검사하고, 메모리를 해제하기 위해 콘솔에서 표현식을 평가하며, 이후 디버깅을 위해 실행을 재개할 기회를 제공합니다.

V8 임베더는 ResourceConstraints API의 set_max_old_generation_size_in_bytes 함수를 사용하여 힙 제한을 늘릴 수 있습니다. 그러나 주의하십시오. 쓰레기 수집기의 일부 단계는 힙 크기에 선형적으로 의존합니다. 더 큰 힙에서는 쓰레기 수집 중지 시간이 늘어날 수 있습니다.