ضخمة التطبيق على شبكة الإنترنت مع تسرب الذاكرة في IE 6

StackOverflow https://stackoverflow.com/questions/19773

  •  09-06-2019
  •  | 
  •  

سؤال

لدي شبكة ضخمة التطبيق الذي هو وجود مشاكل مع تسرب الذاكرة في IE 6.

إصلاح تسرب الذاكرة في 5 خط نموذج التعليمات البرمجية التي يوضح المشكلة سهلة.

ولكن إذا كان لدي ضخم جدا في التطبيق ، حيث يجب أن تبدأ من ؟

هل كانت مفيدة؟

المحلول

تحقق من بالتنقيط.التي عادة ما يأخذ التخمين من أي تسرب الذاكرة.

إذا كان لسبب بالتنقيط لا تجد ذلك ، نلقي نظرة فاحصة على أي شفرة جافا سكريبت التي تعمل مع الأحداث.هو دائما تقريبا المصدر أي تسرب الذاكرة في المتصفح.

تدمير عنصر DOM مع معالجات تعلق على ذلك ، دون إزالة تلك معالجات الأولى, ومنع الذاكرة المرتبطة بتلك معالجات من يتم استردادها.

نصائح أخرى

هل تطبيق استخدام الكثير من جافا سكريبت ؟

إذا كان كذلك ، ثم شيء واحد لقد وجدت أن يساعد على تجنب تسرب الذاكرة هو التأكد من أن كنت تستخدم جافا سكريبت الإطار مثل النموذج أو مسج لأنها مجربة التعامل مع الحدث البرمجية التي لا تسرب الذاكرة.

هنا هو كيف تحل مشكلة تسرب الذاكرة في IE7.الفكرة هي أن التصرف/تعيين إلى null كل expando-خصائص على جميع دوم العقد في التفريغ صفحة.هذا عملت بالنسبة لي.قد تجد أنه من المفيد.

<!--[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]-->

قد تحتاج إلى إزالة جميع "المصحح;" البيانات إذا كنت لا تشعر مثل التعامل مع بعض استثناءات العرضية.

أنت تسرب الذاكرة من جافا الوظائف ؟

هنا الحل:اتخاذ الخاص بك البيرة جافا و تشوك.استخدام واحدة من مستوى الأطر جافا سكريبت, مسج مثل.

إذا كنت تفعل مجمع جافا سكريبت و لا جافا المعلم لا تفعل ذلك بنفسك.

تحرير:ما هو هذا نصيحة سيئة ؟ جافا سكريبت ليست مجرد لغة البرمجة;لها المعقدة و القوية جدا لغة البرمجة التي ترتبط ارتباطا وثيقا HTML DOM ، والتي يتم تنفيذها بشكل مختلف في مختلف المتصفحات.إذا كنت تفعل ذلك الخطأ, سوف ليس فقط تسرب الذاكرة ولكن أيضا رمي الأخطاء في كل مكان عموما تجعل تجربة التصفح فظيعة.هل تريد إبعاد الناس يأتون إلى موقع الويب الخاص بك ؟ لا ؟ ثم استخدام جافا سكريبت إطار التخلص من كل ما تبذلونه من المباراة عبر متصفح bullshittery.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top