문제

IE 6에서 메모리 누수 문제가 있는 거대한 웹 앱이 있습니다.

문제를 보여주는 5줄 코드 샘플에서 메모리 누수를 수정하는 것은 쉽습니다.

하지만 매우 큰 애플리케이션이 있는 경우 어디서부터 시작해야 합니까?

도움이 되었습니까?

해결책

확인해 보세요 똑똑 떨어지는 물방울 소리.이는 일반적으로 IE 메모리 누수에 대한 추측을 없애줍니다.

어떤 이유로 Drip이 이를 찾지 못하면 이벤트와 함께 작동하는 JavaScript 코드를 자세히 살펴보십시오.이는 거의 항상 브라우저에서 심각한 메모리 누수의 원인입니다.

핸들러를 먼저 제거하지 않고 핸들러가 연결된 DOM 요소를 삭제하면 해당 핸들러와 연결된 메모리가 복구되지 않습니다.

다른 팁

애플리케이션이 JavaScript를 많이 사용합니까?

그렇다면 메모리 누수를 방지하는 데 도움이 되는 한 가지 방법은 메모리 누수를 방지하는 이벤트 처리 코드를 시도하고 테스트한 Prototype 또는 jQuery와 같은 JavaScript 프레임워크를 사용하고 있는지 확인하는 것입니다.

IE7의 메모리 누수 문제를 해결한 방법은 다음과 같습니다.아이디어는 페이지를 언로드할 때 모든 DOM 노드의 모든 확장 속성을 null로 처리/설정하는 것입니다.이것은 나에게 효과적이었습니다.유용하다고 생각할 수도 있습니다.

<!--[if lt IE 8]>
<script type="text/javascript">

function disposeAll() {
    if (window.document.all) {
        for (var index = 0; index < window.document.all.length; index++) {
            try { dispose(window.document.all[index], []); } catch (e) { debugger; }
        }
    }
    dispose(window.document.body, []);
    dispose(window.document, []);
    dispose(window, []);
    window.disposeAll = null;
    window.dispose = null;
    window.onunload = null;
}

function dispose(something, map) {
    if (something == null) return;
    if (something.dispose && typeof (something.dispose) == 'function') {
        try { something.dispose(); } catch (e) { debugger; }
    }
    map.push(something);
    for (var key in something) {
        var value = null;
        try { value = something[key]; } catch (e) { };
        if (value == null || value == dispose || value == disposeAll) continue;

        var processed = null;
        for (var index = 0; index < map.length; index++) {
            if (map[index] === value) {
                processed = value;
                break;
            }
        }
        if (processed != null) continue;
        var constructor = value.constructor;
        if (constructor == Object || constructor == Array) {
            try { dispose(value, map); } catch (e) { debugger; }
        }
        if (constructor == Object || constructor == Array || constructor == Function) {
            try { something[key] = null; } catch (e) { debugger; }
        }
    }
    map.pop();
}

(function() {
    var previousUnloadHandler = window.onunload;
    if (previousUnloadHandler == null) {
        window.onunload = disposeAll;
    } else {
        window.onunload = function() {
            previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
            disposeAll();
            previousUnloadHandler = null;
        };
    }
}());

</script>
<![endif]-->

모든 "디버거"를 제거 할 수 있습니다. 가끔 예외를 다루고 싶지 않다면 진술.

Java 함수에서 메모리가 누출되고 있습니까?

해결책은 다음과 같습니다.자작 자바를 가져 와서 척보세요.jQuery와 같은 표준 자바스크립트 프레임워크 중 하나를 사용하세요.

복잡한 자바스크립트를 수행 중이고 자바 전문가가 아닌 경우 직접 수행하지 마세요.

편집하다:그게 나쁜 조언인가요?Javascript는 단순한 스크립트 언어가 아닙니다.HTML DOM과 밀접하게 연결되어 있으며 브라우저마다 다르게 구현되는 복잡하고 놀랍도록 강력한 프로그래밍 언어입니다.잘못하면 메모리 누수뿐만 아니라 모든 곳에서 오류가 발생하고 일반적으로 검색 경험이 끔찍해집니다.귀하의 웹사이트를 방문하는 사람들을 쫓아내고 싶습니까?아니요?그런 다음 자바스크립트 프레임워크를 사용하여 브라우저 간 헛소리를 모두 제거하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top