IE 메모리 유출 및 회수불가 연구 소결(지속 증가 중)
전에 많은 자료를 봤지만 이 형님의 말은 화룡점정이라고 할 수 있습니다. 아첨하는 것이 아니라 제 임독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: 즉시 석방.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다른 사람의 웹사이트 편집: contenteditable 및 designMode그래도 우리가 그렇게 할 수 있다고 생각하는 것은 멋진 일입니다. 제가 강조하고 싶었던 일종의 관련 API가 실제로 몇 개 있기 때문에 오늘 그것을 가져왔습니다. contenteditable는 "true" 값이 할당...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.