2009-07-03 9 views
8

저는 브라우저에서 메모리 누수를 감지하려고 시도하고 있습니다. IE. Javascript 엔진과 DOM 개체 트리 사이의 가비지 수집 알고리즘이 일치하지 않아 누수가 발생했음을 이해하고 과거에는 계속 유지됩니다. 내가 이해하지 못하는 이유는 (내가 읽은 기사의 일부 진술에 따르면) 브라우저가 페이지를 언로드 한 후에 메모리가 회수되지 않는 이유이다. 웹 페이지에서 벗어나면 모든 DOM과 javascript 객체를 그 범위에서 벗어나야합니다. 그렇죠?웹 페이지를 언로드 한 후에 자바 스크립트 메모리 누수가 발생했습니다.

+0

정확히 누출 된 이유 :) 메모리를 회수 할 수 없습니다. –

답변

8

여기에 문제가 있습니다. IE에는 DOM과 자바 스크립트에 대한 별도의 가비지 수집기가 있습니다. 그들은 둘 사이의 순환 참조를 감지 할 수 없습니다.

이전에는 페이지 언로드시 모든 노드의 모든 이벤트 처리기를 정리하는 것이 었습니다. 그러나 언로드하는 동안 브라우저를 중지 할 수 있습니다. 이것은 순환 참조가 이벤트 핸들러에 의해 발생한 경우에만 해당됩니다. 또한 DOM 노드 자체에 대한 참조가있는 js 객체에 DOM 노드의 직접 참조를 추가하여 발생할 수 있습니다.

또 다른 좋은 점은 노드를 삭제하는 경우 핸들러를 먼저 제거하는 것이 좋습니다. Ext-js에는 Ext.destroy 메소드가 있습니다 (ext를 사용하여 핸들러를 설정 한 경우).

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property 
function El(node) { 
    this.dom = node; 
    node.el = this; 
} 

그런 다음 Microsoft는 따라서는 JS로하는 것보다 훨씬 빠르다, 내부적으로 언로드 할 때 IE는 그래서 모든 이벤트 핸들러와의 expando 속성을 제거 해킹. 이 수정은 우리의 기억 문제를 해결하는 것처럼 보였지만, 여전히 문제가있는 사람들이 있기 때문에 모든 문제가 아닙니다. 우리의 회사에서 IE still has some problems

Blog about fixed memory leaks

MS releases patch that "fixes" memory leaks:

MS's description of the problem

, 우리는 EXT-JS 사용합니다. 내부 정리 루틴이있는 ext-js를 사용하여 이벤트 핸들러를 항상 설정함으로써 메모리 누수가 발생하지 않았습니다. 실제로 메모리 사용량은 증가하지만 4Gb RAM을 갖춘 시스템의 경우 약 250Mb에서 멈 춥니 다. 우리는 약 2MB의 (압축되지 않은) js 파일을로드하고 페이지의 모든 요소가 동적이기 때문에 그렇게 나쁘지 않다고 생각합니다.

이것에 관해서는 많이 언급 할 것이고 우리는 내가 일하는 곳에서 이것을 광범위하게 연구했습니다. 좀 더 구체적인 질문을하십시오. 나는 너를 도울 수 있을지 모른다.

+0

연구 해 주셔서 감사합니다. IE9가 전혀 개선 되었습니까? innerHTML 속성을 설정하고 클라이언트가 VMWARE에서 실행 중이며 메모리가 빠르게 유출되면 누출이 발생합니다. 인트라넷 사용자에게 앱을 다시 열도록 요청하는 것은 해결책이 아니지만 선택의 여지가 없습니다. –

+1

@AlexanderN'innerHTML'을 설정할 때 메모리가 증가하는 경우 첨부 된 핸들러를 분리하지 않고 DOM에서 노드를 제거하여 누수가 발생할 가능성이 큽니다. 먼저 핸들러를 제거하지 않고'innerHTML'을 덮어 쓰지 말아야합니다. 그것은 모든 브라우저에 적용됩니다. –

3

내가 읽은 가장 좋은 점은 Doulgas Crockford가 작성한 것입니다. Javascript memory leaks

질문에 대답하려면 브라우저가 절대적으로 이어야합니다.은 적절한 시간에 모든 개체 (가장 중요한 것은 이벤트 처리기)를 언로드해야합니다. 만약 그렇다면, 누출은 없을 것입니다.

0

당신은 그들을 이해할 필요가 없습니다 - 그들은 broswers의 버그이며 버전마다 다릅니다.

+0

한 버전이 고정 되어도 버그가 배제되지 않습니다. 모든 고객이 업그레이드 할 수 없으면 이전 버전의 브라우저가 계속 사용됩니다. 웹 개발을 할 때 브라우저가 어떻게 작동하는지 이해하는 것은 대단히 중요합니다. –

관련 문제