Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 순환 참조가 어떻게 메모리 누수를 일으킬 수 있습니까?

<시간/>

순환 참조

순환 참조는 각 개체에 1의 참조 카운트를 제공하여 두 변수가 서로 참조할 때 형성됩니다. 순수 가비지 수집 시스템에서는 관련된 변수에 참조가 없을 때 순환 참조가 문제가 되지 않을 수 있습니다. 이 시나리오에서 선언된 변수는 가비지 수집됩니다. 참조 카운팅 시스템에서는 참조 카운트가 0일 수 없기 때문에 객체 중 어느 것도 파괴되지 않습니다.

참조 카운팅과 가비지 컬렉션을 사용하는 하이브리드 시스템에서는 시스템이 순환 참조를 식별하지 못하기 때문에 메모리 누수가 발생합니다.

다음 예제는 javascript 객체와 DOM 객체 사이의 순환 참조를 보여줍니다. javascript 객체에는 DOM 객체(Div)에 대한 참조가 있고 Dom 객체(Div)는 "expando" 속성을 통해 javascript 객체(obj)에 대한 참조가 있습니다. 두 개체가 서로 참조되었기 때문에 메모리 누수를 일으켜 아무 것도 파괴할 수 없습니다.

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   };
</script>
</body>
</html>

메모리 누수 방지

다음 예제에서 처음에는 자바스크립트 객체와 DOM 객체가 모두 순환 참조에 있지만 null이 자바스크립트 객체에 할당되면 객체(자바스크립트와 DOM 객체)는 모두 자바스크립트 객체가 참조하는 대상인지 파악하기 위해 딜레마에 빠지게 됩니다. 순환 참조를 깨서 null 또는 DOM 개체.

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   obj = null        // this breaks circular reference
   };
</script>
</body>
</html>