2010-06-21 4 views
6

책 학습 jQuery를는 IE 함수를 참조하는 특성을 갖는 DOM 객체 메모리 누수가라고하고, 함수는 다음과 같이, 따라서 "원형 기준"을 갖는 상기 DOM 오브젝트 참조 :Internet Explorer에서 페이지를 탐색 할 때도 메모리 누수가 왜 유지됩니까?

onload = function() { 
    var foo = document.getElementById('foo'); 
    foo.onclick = function() { // DOM object foo's onclick property refers to a function 
     foo.innerHTML = "hello" // the function's body refers to the DOM object 
    }       // therefore circular reference 
} 

IE 가비지 컬렉션을위한 순환 참조를 처리 할 수 ​​있지만 순환 참조가 DOM 객체와 Javascript 객체를 모두 포함하는 경우에는 서로 다른 메모리 관리자가 처리하므로 원형 참조는 처리 할 수 ​​없습니다.

하고 :

[메모리 누수 ... 및 발명자가 얻어 페이지에서 이동하는 경우에도, 생성 [참조] 루핑 IE가 를 해제 할 수 없다.

브라우저가 닫힐 때까지 절대로 해제되지 않습니다.

사실입니까? 사용자가 페이지를 떠난 후에도 IE가 메모리를 해제하지 않는 이유는 무엇입니까? 사용자가 Back을 클릭하여 페이지로 돌아올 수 있고 IE가 페이지의 상태를 유지하려고하기 때문입니까? 이 경우 사용자가 메모리 누수 페이지를 방문한 다음 Back을 클릭 한 다음 google.com으로 이동하면 어떻게됩니까? 그런 다음 페이지를 Back 또는 Forward으로 볼 수 없으며 브라우저를 닫지 않고 메모리 누수 문제가 해결 될 수 있습니까?

또는 브라우저가 닫히지 않고 탭을 닫은 경우에도?

Internet Explorer 8에서도 이러한 종류의 메모리 누수가 발생합니까?

+0

많은 프로그램이 메모리 누수 문제가있는 개체를 처리하지 못하면

  • 를 해제 실패
  • 에 대한 참조를 개최; 새로운 IE 버전에서는 많은 메모리 누수가 발생하지만이 크기의 프로젝트에는 모든 메모리 누수가 막히기 쉽습니다. – Piskvor

  • 답변

    3

    메모리 누수는 프로그램 버그의 한 종류이므로 기본적으로 "IE가 왜 버그가 있습니까?"라고 묻습니다. 그 대답은 분명히 "프로그래머가 어딘가에서 실수를 저질렀 기 때문에"입니다.

    일부 브라우저는 Opera (Opera와 FF)에서 멀리 이동할 때도 의도적으로 페이지 상태를 유지하지만 "메모리 누출"은 프로그램에서 더 이상 사용하지 않는 메모리를 의미하지만 릴리스하는 것을 잊었습니다. 이 경우, IE는 메모리 부분에 신경을 쓰지 않고 OS (Windows)에 알려주지 않았습니다. 여전히 OS에서는 "IE에서 사용"한 것으로 간주합니다. 따라서 브라우저의 프로세스가 종료 될 때 OS는 해당 프로세스에 할당 된 모든 메모리를 "사용 가능"으로 표시하기 때문에 메모리의이 부분은 브라우저가 닫힐 때까지 사람이없는 곳에서 정지합니다.

    메모리 누수는 다소 교활한 유형의 버그입니다. 프로그램이 올바르게 작동하지만 점차 메모리가 점점 소모되기 때문입니다.

    이 주제에 대한 추가 정보는 http://en.wikipedia.org/wiki/Circular_referencehttp://en.wikipedia.org/wiki/Garbage_collection_(computer_science)을 참조하십시오.

    +0

    "순환 참조"에 "페이지 수준"범위가 있습니까? 따라서이 페이지에서 메모리가 누출되고 '뒤로'를 클릭하여 google.com으로 이동하면 해당 페이지는 '뒤로'및 '앞으로'순서에서 "사라집니다". 그러면 해당 페이지와 관련된 모든 메모리를 해제 할 수 있습니다. –

    +0

    @ Jian Lin : 그렇습니다. 그것이 작동하기로되어있는 방법입니다. 그러나 IE의 프로그래머는 모든 페이지 참조가 올바르게 해제되었는지 확인하는 것을 잊어 버렸고 IE *가 올바르게 정리했다고 생각하면 메모리에 일부 데이터가 남아있어 더 이상 알 수 없습니다. – Piskvor

    +1

    @ Jian : 효과가 있으면 좋을 것 같습니다. 이 문제가 계속 발생한다는 사실은 가비지 컬렉터가 메모리가 여전히 적절하게 참조되는지 (예기치 않은 경로를 통해) 또는 가비지 컬렉터가 메모리를 회수하기에는 너무 어리 석다거나 가비지 컬렉터가 없다고 생각한다는 것을 나타냅니다 . IE에 소스가 없다면 문제가 무엇인지 평가할 수 없습니다 (또는 디 컴파일하면 희미한 차선책입니다). –

    1

    응용 프로그램 프로그래머 (이 경우 IE) 중 하나가 메모리를 사용하고있는 무언가 (개체, 리소스)를 제대로 처리하지 못했기 때문에 누출이있었습니다.MSDN the three commonest causes of leaks in managed applications

    고려된다 :

    • 관리 객체 관리되지 않는 리소스 드로잉
    관련 문제