2009-10-05 3 views
22

Javascript에 가비지 컬렉터가 있다는 것을 알고 있습니다. 따라서 삭제를 사용하여 객체에 대한 참조 만 제거하고이 객체에 대한 참조가 더 이상 없을 때 GC에 의해 삭제됩니다.자바 스크립트 메모리 관리 함정?

클로저, 퍼지 이름 공간 및 프로토 타입 상속을 사용하면 자바 스크립트가 까다 롭습니다. 현재 또는 그 이유를 언제 알 수있는 것은 아닙니다.

상당히 큰 자바 프로젝트를 코딩 중이며 전역 메모리 사용을 제한하면서 메모리 누수를 방지하려고합니다. 나는 최적화 단계에 있지는 않습니다. (물건을 먼저 가져 오도록합시다 :-)), 그러나 허위 코드 작성을 피하기 위해 메모리 관리에 대한 좋은 습관을 아는 것이 좋을 것입니다.

  • 따라서 언제 을 사용해야합니까?을 삭제 하시겠습니까?
  • 내가 피해야하는 트랩은 무엇입니까? 개체를 사용하고 있습니까?
  • 폐쇄에 대해 알아야 할 몇 가지 사항이 있습니까?
  • 강조할만한 우수 사례가 있습니까?
+0

'언제 ** 지금 ** 또는 그 이유'를 알고있는 곳에 오타가있을 수 있습니까? 나는이 영어 비트를 파싱 할 수 없다 ... – hippietrail

+0

나는 나 자신을 이해하지 못한다. 어쩌면 내가 술에 취해 졌을 수도 있고, 내가 그것을 썼을 때 일어 났을 수도 있습니다. 아니면 둘다. 그냥 무시해. –

답변

3

DOM 노드에 데이터를 저장하면 모든 브라우저에서 처리 할 수있는 순환 참조를 쉽게 만들 수 있다고 생각합니다. 예를 들면 : 당신이 연결된 이벤트 리스너를 한 경우가로 removeChild를 사용하여 제거 후 IE에서

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • , 적어도 이전 버전에서, DOM 요소는 메모리에 저장되었다. 메모리에서 제거하는 유일한 방법은 이벤트를 DOM에서 제거하기 전에 분리하는 것입니다.
  • 요소를 자주 만들고 제거하지 않는 한 실제로 걱정할 필요가 없습니다. 응용 프로그램이 시작될 때 많은 요소를 만들고 그 후에 새 객체를 만들지 않으면 메모리 누수에 대해 너무 걱정하지 마십시오.
10

내 경험에 비추어 볼 때 가비지 수집기는 브라우저에 따라 잘 구현되거나 잘 수행되지 않습니다. 좋은 객체 지향 프로그래밍 기법을 적용하는 것이 좋은 출발점입니다.

내 유일한 조언

: (DOM 및 JS GC를 클리어되지 않습니다 순환 참조) 개체를 자바 스크립트 DOM &를 연결하여 메모리 누수를 작성하지 않습니다. 이러한 실수는 응용 프로그램 내에서 인스턴스화 할 객체보다 훨씬 많은 메모리를 사용합니다.

DOM/JS 메모리 누수에 대한 자세한 내용. http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

DOM을 js 객체와 연결하는 것에 동의하는 것이 내가 알고있는 가장 큰 문제입니다. 나는 대부분의 브라우저가 각각 DOM과 JS 객체에 대해 서로 다른 메모리 힙을 가지고 있다고 생각한다. 그래서 그들 사이의 연결은 종종 메모리 누수의 원인이된다. 또 다른 유용한 링크 : http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta