IE 메모리 유출 및 회수불가 연구 소결(지속 증가 중)

1. 메모리 유출
전에 많은 자료를 봤지만 이 형님의 말은 화룡점정이라고 할 수 있습니다. 아첨하는 것이 아니라 제 임독2맥을 단번에 뚫었습니다. 보십시오.
trarck
IE의 메모리 유출 원인은 순환 인용인데 IE의 쓰레기 수거기가 이런 인용을 잘 처리하지 못한다.
유출된 순환 인용이 발생하고 고립된 DOM 대상만 발생합니다.
고립된 DOM 객체 간의 순환 참조, 고립된 DOM 객체와 JS 객체의 순환 참조.
왜 고립된 DOM 대상이죠?페이지를 떠날 때(새로 고침, 점프) 전체 DOM 트리가 삭제되고 DOM 트리에 있는 객체가 삭제되며 순환 참조가 있어도 끊깁니다.
고립된 DOM 객체는 다음과 같습니다. 하나, JS를 사용하여 만들지만 DOM 트리에 포함되지 않습니다.2. DOM 트리에서 삭제됩니다.
그러니 유출을 피하고 이런 DOM 대상이 생기지 않도록 하세요.
때때로 이런 대상은 피할 수 없으니, 이렇게 대상에게 순환 인용이 생기지 않도록 해라.
가장 흔히 볼 수 있는 순환 인용은 실행 환경의 변수(파라미터 포함)가 DOM 대상을 인용하는 클로즈업으로 만들어진다.
이 말을 보고 전전긍긍하며 예시를 모방할 줄만 알았던 나는 즉각 새로운 예를 만들었다.
예 1:
<input type="button" value="leak" id="leak" onclick="location.reload();"/>

<script type="text/javascript"><!--
(function(){
		var test=$('<div />')[0];
		test.onclick=function(){};
		var s=[];
		for(var i=0;i<10000;i++){
			s.push('aaaa');
		}
		test.expan=s.join(''); 
		//$('body').append(test);
		//   DOM      
})();		
//--></script>

특수: iframe
테스트 도구는 sIEve-0.0.8입니다.
iframe에서 페이지를 새로 고침하면 페이지에 누출이 많아서 매번 한 번씩 두 배로 증가한다.그러나 마지막에 아버지 페이지를 새로 고쳤을 때 모든 유출은 사라졌다.
iframe를 단독 테스트(리셋)로 제시하여 누설되지 않았습니다.
2. 메모리 회수
1. 전역 참조를 지웁니다.전역 인용이 존재하기만 하면 브라우저가 대응하는 대상을 방출할 수 없다. 왜냐하면 인용의 생명 주기 내에 대상은 언제든지 호출될 수 있기 때문이다.

<input type="button" value="TO GC" onclick="toGC()" />
<script type="text/javascript"><!--
function toGC(){
	g.s=null;
}

var g={};
g.s=[];
for ( var i=0;i<100;i++){
	g.s.push($('<div  />')[0]);
}
//--></script>

TO GC 버튼을 클릭하지 않으면 페이지의 unload까지 생성된div는 영원히 해제되지 않습니다.
2. 브라우저마다 다른 메모리 방출 메커니즘
unload (예컨대 href가about:blank를 가리킬 때) 는 서로 다른 브라우저에서 메모리를 방출하는 정상적인 페이지입니다.테스트를 하여 모 유명 전자상거래 사이트를 테스트 대상으로 삼았다.
IE7: 현저한 방출이 나타나지 않고 1시간을 기다려도 마찬가지로 메모리가 높다.창을 최소화해야 몇 M 수준으로 놓을 수 있습니다.
FireFox3: 어쨌든 풀지 않습니다. 아직 방법을 찾지 못했습니다. (물론 창을 닫는 것을 제외합니다.)
Chrome6: 즉시 석방.

좋은 웹페이지 즐겨찾기