본문 바로가기
Javascript

원시 타입과 참조 타입 - 3.V8 엔진의 Oddball 타입

by East-K 2024. 10. 21.

이전 글에서는 V8 엔진에서의 문자열 처리 방법을 살펴보았습니다. 이번 글에서는 자바스크립트에서 자주 사용되는 값들인 Oddball에 대해 알아보겠습니다.



자바스크립트 공식 문서를 아무리 찾아봐도 Oddball이라는 용어는 찾아보기 어렵습니다. 그래서 V8 엔진의 내부 코드와 크롬 개발자 도구를 통해 이 값들이 메모리에서 어떻게 관리되는지 살펴보겠습니다.

V8 엔진에서의 Oddball 타입

V8 엔진에서는 null, undefined, true, false 값을 Oddball로 처리합니다. 이를 설명하는 코드는 다음과 같습니다. (v8/oddball.h)

// Oddball은 객체 `null`, `undefined`, `true`, `false`를 설명합니다.
V8_OBJECT class Oddball : public PrimitiveHeapObject {
 public:
  // [to_number_raw]: Cached raw to_number computed at startup.
  DECL_PRIMITIVE_ACCESSORS(to_number_raw, double)
  inline void set_to_number_raw_as_bits(uint64_t bits);
  ...

이 설명만으로는 왜 이 값들이 Oddball로 불리며, 어떻게 처리되는지 명확히 알기 어렵습니다. 이를 더 자세히 알아보기 위해 크롬 개발자 도구의 메모리 탭을 활용해 이 값들이 실제 메모리에서 어떻게 다뤄지는지 확인해 보겠습니다.

class OddballSnapshot {
  constructor() {
    this.null = null;
    this.undefined = undefined;
    this.true = true;
    this.false = false;
  }
}

// 인스턴스를 생성합니다.
const oddballSnapshot = new OddballSnapshot();
const oddballSnapshot2 = new OddballSnapshot();

위 코드를 실행한 후 힙 스냅샷을 찍어보면, oddball 타입으로 나타나는 값들이 동일한 메모리 주소를 공유하고 있음을 확인할 수 있습니다. 즉, null, undefined, true, false 값들은 각각의 인스턴스에서 같은 메모리 주소를 사용합니다.

oddballSnapshot / oddballSnapshot2

  • null::null@71
  • undefined::undefined@67
  • true::true@73
  • false::false@75

이 값들은 이전에 다뤘던 smi number정적인 문자열과 다를 바 없어 보이지만, 만약 위 코드를 주석 처리한 후에도 여전히 메모리 탭에서null, undefined, true, false 값들이 시스템 영역에 미리 할당되어 있는 것을 볼 수 있습니다.

 

V8 엔진에서의 미리 할당된 Oddball 값들

V8 엔진에서는 이 네 가지 값이 스크립트 실행 중 빈번히 사용되기 때문에, 실행 중에 새롭게 할당하는 대신 애초에 메모리에 미리 저장해둡니다. 이렇게 하면 성능을 최적화할 수 있고, 매번 메모리에서 확인하거나 재사용할 필요 없이 즉시 접근이 가능해집니다. 상수처럼 미리 메모리에 할당해 두고 빠르게 사용할 수 있게 처리된 것으로 추정됩니다.

결론

이번 글에서는 Oddball 타입(null, undefined, true, false)에 대해 알아보았습니다. 자바스크립트 공식 문서에서는 관련 내용을 찾기 어려웠기 때문에, 크롬 개발자 도구를 활용한 테스트를 기반으로 내용을 작성했습니다. V8 엔진이 왜 이 값들을 Oddball로 별도로 처리하는지에 대한 이유는 추측일 뿐이며, 확실한 정보는 아닙니다. 이에 대해 더 자세한 공식 문서나 자료가 있거나, 추가로 궁금한 부분이 있다면 댓글 부탁드립니다!



원시 타입과 참조 타입 시리즈

  1. V8 엔진의 숫자 처리 방식
  2. V8 엔진의 문자열 처리 메커니즘
  3. V8 엔진의 Oddball 타입 (본 게시글)
  4. V8 엔진의 참조 타입