[JS] Maximum call stack size

2022. 9. 3. 23:55개발 대화를 위한 얕은 지식

뜬금없이 궁금해졌다

자바스크립트에서 종료 조건이 없는 재귀 함수를 호출하면 Maximum call stack size exceeded 에러가 발생한다.


그렇다면 호출 가능한 최대 콜스택은 얼마나 될까?


간단한 코드로 확인이 가능하다.

참고로 꼬리물기 최적화를 적용하면 무한루프가 돌아버리기 때문에 아래와 같은 형태로 호출해야만 한다.

function getMaxCallStackSize() {
  try {
    return 1 + getMaxCallStackSize();
  } catch (e) {
    // Maximum call stack size exceeded
    return 1;
  }
}

getMaxCallStackSize();

간단한 js 런타임을 제공하는 runJS 내에서는 9078

크롬 브라우저 콘솔에서는 9157

사파리 브라우저 콘솔에서는 45611

각 환경마다 최대 콜스택 크기가 다르다는걸 알 수 있다.

그리고 잴 때마다 또 다르다.

근데 왜 다르지?

 

왜긴 왜야.

 

브라우저(혹은 자바스크립트 런타임이 동작하는 기타 환경 및 플랫폼)에서 본인이 점유한 메모리 중에서 적당한 양을 알아서 할당하기 때문이다.

 

 

아래는 같이 읽으면 재미있을지도 모르는 글들

 

V8에서의 메모리 관리가 전반적으로 어떻게 되는지 알 수 있다.

특히 V8 내부에서 js object가 최소 24bit(8+8+8+8*N)를 점유한다는 것을 알 수 있었다. (그리고 array 선언을 어떻게 하느냐에 따라 성능이 어떻게 달라지는지)

 

 

How is data stored in V8 JS engine memory?

Introduction After working for a few years on embedded systems and industrial PCs, focusing on low-level software development on Linux kernels, RTOS and

blog.dashlane.com

 

 

이건 2012년 문서인데, v8 내부 객체에 대해 자세히 나와있다.

 

A tour of V8: object representation

JavaScript allows developers to define objects in a very flexible way. This article looks at the clever optimizations V8 uses to make accessing JavaScript objects as fast as objects in class-based languages.

jayconrod.com