페이지 표시 설정

26 메모리 관리

26.1 WeakRef 객체

WeakRef는 대상 객체 또는 Symbol이 가비지 컬렉션되지 않도록 유지하지 않으면서 이를 참조하는 데 사용되는 객체입니다. 대상이 가비지 컬렉션에 의해 회수되지 않았다면 WeakRef를 역참조하여 대상 값에 접근할 수 있습니다.

26.1.1 WeakRef 생성자

WeakRef 생성자는:

  • %WeakRef%입니다.
  • 전역 객체의 "WeakRef" 프로퍼티의 초기 값입니다.
  • 생성자로 호출되면 새로운 WeakRef를 생성하고 초기화합니다.
  • 함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던집니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 WeakRef 동작을 상속하려는 하위 클래스 생성자는 WeakRef.prototype의 내장 메서드를 지원하는 데 필요한 내부 상태로 하위 클래스 인스턴스를 생성하고 초기화하기 위해 WeakRef 생성자에 대한 super 호출을 포함해야 합니다.

26.1.1.1 WeakRef ( target )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 던집니다.
  2. CanBeHeldWeakly(target)이 false이면 TypeError 예외를 던집니다.
  3. weakRef를 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRef.prototype%", « [[WeakRefTarget]] »)로 둡니다.
  4. AddToKeptObjects(target)를 수행합니다.
  5. weakRef.[[WeakRefTarget]]을 target으로 설정합니다.
  6. weakRef를 반환합니다.

26.1.2 WeakRef 생성자의 프로퍼티

WeakRef 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

26.1.2.1 WeakRef.prototype

WeakRef.prototype의 초기 값은 WeakRef 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

26.1.3 WeakRef 프로토타입 객체의 프로퍼티

WeakRef 프로토타입 객체는:

  • %WeakRef.prototype%입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[WeakRefTarget]] 내부 슬롯을 갖지 않습니다.
규정 선택 사항

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructor의 초기 값은 %WeakRef%입니다.

26.1.3.2 WeakRef.prototype.deref ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. weakRef를 this 값으로 둡니다.
  2. ? RequireInternalSlot(weakRef, [[WeakRefTarget]])을 수행합니다.
  3. WeakRefDeref(weakRef)를 반환합니다.
참고

WeakRef가 undefined가 아닌 target 값을 반환하면 현재 ECMAScript 코드 실행이 완료될 때까지 이 target 값은 가비지 컬렉션되어서는 안 됩니다. AddToKeptObjects 연산은 읽기 일관성이 유지되도록 합니다.

let target = { foo() {} };
let weakRef = new WeakRef(target);

// ... 나중에 ...

if (weakRef.deref()) {
  weakRef.deref().foo();
}

위 예에서 첫 번째 deref가 undefined로 평가되지 않으면 두 번째 deref도 undefined로 평가될 수 없습니다.

26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "WeakRef"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

26.1.4 WeakRef 추상 연산

26.1.4.1 WeakRefDeref ( weakRef )

추상 연산 WeakRefDeref. 인수 weakRef (WeakRef). 반환값: ECMAScript 언어 값. 호출되면 다음 단계를 수행한다.

  1. target을 weakRef.[[WeakRefTarget]]으로 둡니다.
  2. target이 empty가 아니면, 다음을 수행합니다.
    1. AddToKeptObjects(target)를 수행합니다.
    2. target을 반환합니다.
  3. undefined를 반환합니다.
참고

이 추상 연산은 생존성을 간결하게 정의할 수 있도록 하기 위해서만 WeakRef.prototype.deref와 별도로 정의됩니다.

26.1.5 WeakRef 인스턴스의 프로퍼티

WeakRef 인스턴스는 WeakRef 프로토타입 객체에서 프로퍼티를 상속하는 일반 객체입니다. WeakRef 인스턴스는 [[WeakRefTarget]] 내부 슬롯도 갖습니다.

26.2 FinalizationRegistry 객체

FinalizationRegistry는 대상 객체와 Symbol이 가비지 컬렉션될 때 수행되는 정리 연산의 등록 및 등록 해제를 관리하는 객체입니다.

26.2.1 FinalizationRegistry 생성자

FinalizationRegistry 생성자는:

  • %FinalizationRegistry%입니다.
  • 전역 객체의 "FinalizationRegistry" 프로퍼티의 초기 값입니다.
  • 생성자로 호출되면 새로운 FinalizationRegistry를 생성하고 초기화합니다.
  • 함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던집니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 FinalizationRegistry 동작을 상속하려는 하위 클래스 생성자는 FinalizationRegistry.prototype의 내장 메서드를 지원하는 데 필요한 내부 상태로 하위 클래스 인스턴스를 생성하고 초기화하기 위해 FinalizationRegistry 생성자에 대한 super 호출을 포함해야 합니다.

26.2.1.1 FinalizationRegistry ( cleanupCallback )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 던집니다.
  2. IsCallable(cleanupCallback)이 false이면 TypeError 예외를 던집니다.
  3. finalizationRegistry를 ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistry.prototype%", « [[Realm]], [[CleanupCallback]], [[Cells]] »)로 둡니다.
  4. activeFunc를 활성 함수 객체로 둡니다.
  5. finalizationRegistry.[[Realm]]을 activeFunc.[[Realm]]으로 설정합니다.
  6. finalizationRegistry.[[CleanupCallback]]을 HostMakeJobCallback(cleanupCallback)으로 설정합니다.
  7. finalizationRegistry.[[Cells]]를 새로운 빈 List로 설정합니다.
  8. finalizationRegistry를 반환합니다.

26.2.2 FinalizationRegistry 생성자의 프로퍼티

FinalizationRegistry 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 다음 프로퍼티를 갖습니다:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototype의 초기 값은 FinalizationRegistry 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

26.2.3 FinalizationRegistry 프로토타입 객체의 프로퍼티

FinalizationRegistry 프로토타입 객체는:

  • %FinalizationRegistry.prototype%입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[Cells]] 및 [[CleanupCallback]] 내부 슬롯을 갖지 않습니다.

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructor의 초기 값은 %FinalizationRegistry%입니다.

26.2.3.2 FinalizationRegistry.prototype.register ( target, heldValue [ , unregisterToken ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. finalizationRegistry를 this 값으로 둡니다.
  2. ? RequireInternalSlot(finalizationRegistry, [[Cells]])를 수행합니다.
  3. CanBeHeldWeakly(target)이 false이면 TypeError 예외를 던집니다.
  4. SameValue(target, heldValue)이 true이면 TypeError 예외를 던집니다.
  5. CanBeHeldWeakly(unregisterToken)이 false이면, 다음을 수행합니다.
    1. unregisterToken이 undefined가 아니면 TypeError 예외를 던집니다.
    2. unregisterToken을 empty로 설정합니다.
  6. cell을 Record { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken }로 둡니다.
  7. cell을 finalizationRegistry.[[Cells]]에 추가합니다.
  8. undefined를 반환합니다.
참고

이 명세의 알고리즘과 정의에 따르면 finalizationRegistry.[[Cells]]에 cell이 포함되어 있을 때 cell.[[HeldValue]]는 생존합니다. 그러나 이것이 반드시 cell.[[UnregisterToken]] 또는 cell.[[Target]]도 생존한다는 의미는 아닙니다. 예를 들어 객체 자체를 unregister token으로 사용하여 등록해도 그 객체가 영원히 생존하도록 유지되지는 않습니다.

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. finalizationRegistry를 this 값으로 둡니다.
  2. ? RequireInternalSlot(finalizationRegistry, [[Cells]])를 수행합니다.
  3. CanBeHeldWeakly(unregisterToken)이 false이면 TypeError 예외를 던집니다.
  4. removed를 false로 둡니다.
  5. finalizationRegistry.[[Cells]]의 각 Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cell에 대해 다음을 수행합니다.
    1. cell.[[UnregisterToken]]이 empty가 아니고 SameValue(cell.[[UnregisterToken]], unregisterToken)이 true이면, 다음을 수행합니다.
      1. cell을 finalizationRegistry.[[Cells]]에서 제거합니다.
      2. removed를 true로 설정합니다.
  6. removed를 반환합니다.

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "FinalizationRegistry"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

26.2.4 FinalizationRegistry 인스턴스의 프로퍼티

FinalizationRegistry 인스턴스는 FinalizationRegistry 프로토타입 객체에서 프로퍼티를 상속하는 일반 객체입니다. FinalizationRegistry 인스턴스는 [[Cells]] 및 [[CleanupCallback]] 내부 슬롯도 갖습니다.