ASP.NET 강좌와Tip 게시판입니다. - 시삽보기

제목: IE Javascript Memory Leak
글쓴이: 황정현
평점: 10.0/10 (1명 참여)
조회: 1692
참고 : http://www.crockford.com/javascript/memory/leak.html

Internet Explorer DOM 객체에 대하여 메모리 누수가 발생한다. (IE8에서는 개선 되었음)

Div Layer에 동적으로 Flash를 바꿔 낀다고 가졍한다.

1번 Flash는 작업관리자 IExplorer에서 메모리 확인 결과 100mb
2번 Flash는 작업관리자 IExplorer에서 메모리 확인 결과 200mb

이 나온다고 가정하면... 코드는 아래와 같다.

function getFlash(code){
    var sTag = ''
    var obj = document.getElementById("FlashObject");
    if(code === "A"){
        sTag = ''
            + ' <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
            + ' id="a" width="887" height="599"'
            + ' codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">'
            + ' <param name="movie" value="a.swf" />'
            .... 생략 ....
    }else{
        sTag = ''
            + ' <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
            + ' id="b" width="887" height="599"'
            + ' codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">'
            + ' <param name="movie" value="b.swf" />'
            .... 생략 ....
    }
    obj.innerHTML = sTag;
}

Div Layer "FlashObject"에 초기에 b.swf를 로딩하게 되면 작업관리자 IExplorer메모리는 200mb까지 할당된다.

그 상태에서 Div Layer "FlashObject"에 초기에 a.swf를 로딩하게 되면 작업관리자 IExplorer메모리는 순수 a.swf에 해당하는 메모리 100mb을 할당하지 않고 b.swf에 해당하는 메모리 + a.swf에 대항하는 메모리 총 300mb을 할당하는 모습을 볼수 있다. 이 구조를 계속 반복하게 되면 메모리 해제는 하지 못하고 누적되어 브라우저가 죽어버릴 것이다. 

위 사항을 해결할 수 있는 방법으로는 purge함수를 만들어 사용할 수 있다.

purge함수는 DOM Element 인자로 받는다. Element의 Attributes를 루프를 돌면서, 함수를 찾으면 null로 만들어 순환구조를 끊고 메모리가 교정될 수 있도록 한다. 함수는 또한 모든 하위 Element에도 같은 작용을 해서 closure가 잘 제거 되도록 한다. purge함수는 모질라와 오페라에는 아무런 해가 없으며 IE에서만 작용한다. purge함수는 Element가 removeChild메소드나 innerHTML속성으로 삭제되기 전에 호출되어야 한다.

function purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
     a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            purge(d.childNodes[i]);
        }
     }
}

function getFlash(code){
    var sTag = ''
    var obj = document.getElementById("FlashObject");
    if(code === "A"){
        sTag = ''
            + ' <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
            + ' id="a" width="887" height="599"'
            + ' codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">'
            + ' <param name="movie" value="a.swf" />'
            .... 생략 ....
    }else{
        sTag = ''
            + ' <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
            + ' id="b" width="887" height="599"'
            + ' codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">'
            + ' <param name="movie" value="b.swf" />'
            .... 생략 ....
    }
    purge(obj);
    obj.innerHTML = sTag;
}
태그 : Javascript leak Memory 
작성자 정보

글등록 +12 136
덧글등록 +3 27
이름: 황정현(y2kpooh )

Level 18
 [EXP.42/70 ]


메일: y2kpooh골뱅이snaps.co.kr

홈페이지: using.tistory.com/
자기소개
글 공유하기 |
 tweet facebook
2009-12-19 오후 3:34:06
IP: 118.36.235.152
        
트랙백 주소 : http://www.hoons.kr/29638/BoardTrackback.aspx ()
등록된 트랙백 0

나도한마디
사용자
글등록 +120  덧글등록 +18
제이크            [2009-12-29]
Level 1
 [EXP.12/16]
좋은 정보 감사합니다. 개인적인 블러그에 옮겨 놓으려고 합니다.
문제가 있다면 공개하지 않겠습니다.
(blog: towis.net)
사용자
글등록 +120  덧글등록 +111
별이            [2010-01-26]
Level 3
 [EXP.1/16]
역쉬 ie가 문제야
사용자
글등록 +12136  덧글등록 +196
넷돌이            [2010-04-29]
Level 19
 [EXP.20/70]
좋은 점보 감사해요^^
태그로 엮인글 리스트
  [ASP.NET Q&A] [질문] 일반 자바스크립트를 jQuery 로 변경하는것에 대해 질문드립니다. [2] 평가안됨 뻐럿
  [ASP.NET Q&A] javascript로 webservice호출과 그냥 webservice페이지를 보여주는 것과 차이가 뭐가 있을까요? [2] 평가안됨 홍군
  [ASP.NET 팁] 자바스크립트 CDN 카달로그 입니다. 평가안됨 몬난아
  [ASP.NET Q&A] WebService 이용시 평가안됨 홍군
  [ASP.NET Q&A] 자바스크립트 Json 처리에 대해서 문의드립니다.. [1] 평가안됨 내스타일
  [ASP.NET Q&A] Javascript 질문입니다 [1]+1 평가안됨 Irene
  [ASP.NET Q&A] 자바스크립트로 그리드 뷰 안에 내용을 확인하는 방법이요... 평가안됨 뿌까
  [ASP.NET Q&A] jquery javascript reference path [1] 평가안됨 챠챠
  [실버라이트 팁] 자바스크립트에서 실버라이트로 값넘길때 [4]+1 파일첨부 평가안됨 시선
  [ASP.NET Q&A] javascript 소스 가져오기(?) [2] 평가안됨 레몬소다


사용자 정보

close