[javascript] 자바 스크립트에서 “약한 참조”를 만들 수 있습니까?

자바 스크립트에서 다른 개체에 대한 “약한 참조”를 만드는 방법이 있습니까? 다음은 약한 참조가 무엇인지 설명하는 위키 페이지입니다. 다음은 Java로 설명하는 또 다른 기사입니다. 누구든지 자바 스크립트 에서이 동작을 구현하는 방법을 생각할 수 있습니까?



답변

JavaScript에서 weakref에 대한 언어 지원이 없습니다. 수동 참조 계산을 사용하여 직접 롤링 할 수 있지만 특히 매끄럽지는 않습니다. 프록시 래퍼 개체를 만들 수 없습니다. JavaScript 개체에서는 가비지 수집 시점을 알 수 없기 때문입니다.

따라서 ‘weak reference’는 add-reference 및 remove-reference 메소드를 사용하여 간단한 조회에서 키 (예 : 정수)가되며, 더 이상 수동으로 추적되는 참조가 없으면 항목을 삭제하여 향후 조회를 계속 사용할 수 있습니다. null을 반환하는 키입니다.

이것은 실제로 weakref는 아니지만 동일한 문제 중 일부를 해결할 수 있습니다. 일반적으로 복잡한 웹 애플리케이션에서 DOM 노드 또는 이벤트 핸들러와 이와 관련된 객체 (예 : 클로저) 사이에 참조 루프가있을 때 브라우저 (일반적으로 IE, 특히 이전 버전)에서 메모리 누출을 방지하기 위해 수행됩니다. 이러한 경우 전체 참조 계수 체계가 필요하지 않을 수도 있습니다.


답변

NodeJS에서 JS를 실행할 때 https://github.com/TooTallNate/node-weak을 고려할 수 있습니다 .


답변

업데이트 : 2019 년 9 월

아직 약한 참조를 사용하는 것은 불가능하지만 JavaScript의 WeakRef 가 Work In Progress 이기 때문에 곧 가능할 것 입니다. 아래 세부 정보.

신청

현재 단계 3의 제안 은 완전한 사양을 가지고 있으며 추가 개선에는 구현 및 사용자의 피드백이 필요함 을 의미 합니다.

WeakRef의 제안은 기능의 두 가지 주요 새로운 조각을 포함한다 :

  • WeakRef 클래스를 사용하여 개체에 대한 약한 참조 만들기
  • FinalizationGroup 클래스를 사용하여 개체가 가비지 수집 된 후 사용자 정의 종료 자를 실행합니다.

사용 사례

약한 참조 의 주된 용도 는 큰 개체를 포함하는 캐시 또는 매핑을 구현하는 것입니다. 여기서 큰 개체는 캐시 또는 매핑에 표시되기 때문에 단독으로 유지되지 않는 것이 좋습니다.

마무리 는 프로그램 실행에 도달 할 수 없게 된 개체 이후에 정리할 코드를 실행하는 것입니다. 사용자 정의 종료자는 몇 가지 새로운 사용 사례를 가능하게하며 가비지 수집기가 알지 못하는 리소스를 관리 할 때 메모리 누수를 방지하는 데 도움이 될 수 있습니다.

출처 및 추가 자료

https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references


답변

진정한 약한 참조, 아니요, 아직은 아닙니다 (그러나 브라우저 제작자는 주제를보고 있습니다). 그러나 약한 참조를 시뮬레이션하는 방법에 대한 아이디어가 있습니다.

개체를 구동하는 캐시를 만들 수 있습니다. 객체가 저장 될 때 캐시는 객체가 차지할 메모리 양을 예측합니다. 이미지 저장과 같은 일부 항목의 경우 이것은 간단합니다. 다른 사람들에게는 이것이 더 어려울 것입니다.

객체가 필요할 때 캐시에 요청합니다. 캐시에 객체가 있으면 반환됩니다. 없으면 항목이 생성되고 저장되고 반환됩니다.

약한 참조는 예측 된 총 메모리 양이 특정 수준에 도달하면 항목을 제거하는 캐시에 의해 시뮬레이션됩니다. 검색 빈도에 따라 가장 적게 사용되는 항목을 예측하고, 가져온 시간에 따라 가중치를 부여합니다. 항목을 생성하는 코드가 클로저로 캐시에 전달되는 경우 ‘계산’비용도 추가 될 수 있습니다. 이렇게하면 캐시가 구축하거나 생성하는 데 매우 비싼 항목을 보관할 수 있습니다.

삭제 알고리즘이 핵심입니다.이 오류가 발생하면 가장 인기있는 항목을 제거 할 수 있기 때문입니다. 이것은 끔찍한 성능을 유발합니다.

캐시가 저장된 객체에 대한 영구 참조 가있는 유일한 객체 한, 위의 시스템은 진정한 약한 참조의 대안으로 잘 작동합니다.


답변

참고 용입니다. JavaScript에는 없지만 ActionScript 3 (ECMAScript이기도 함)에는 있습니다. Dictionary생성자 매개 변수를 확인하십시오 .


답변

JL235위에서 제안한 것처럼 캐싱 메커니즘을 사용하여 약한 참조를 에뮬레이트하는 것이 합리적입니다. 약한 참조가 기본적으로 존재하는 경우 다음과 같은 동작을 관찰합니다.

this.val = {};
this.ref = new WeakReference(this.val);
...
this.ref.get(); // always returns val
...
this.val = null; // no more references
...
this.ref.get(); // may still return val, depending on already gc'd or not

캐시를 사용하면 다음을 관찰 할 수 있습니다.

this.val = {};
this.key = cache.put(this.val);
...
cache.get(this.key); // returns val, until evicted by other cache puts
...
this.val = null; // no more references
...
cache.get(this.key); // returns val, until evicted by other cache puts

참조 보유자로서 값을 참조 할 때 어떤 가정도해서는 안됩니다. 이는 캐시를 사용하는 것과 다르지 않습니다.


답변

마침내 그들은 여기에 있습니다. 아직 브라우저에서 구현되지는 않았지만 곧 구현 될 예정입니다.

https://v8.dev/features/weak-references