ضخمة التطبيق على شبكة الإنترنت مع تسرب الذاكرة في IE 6
-
09-06-2019 - |
سؤال
لدي شبكة ضخمة التطبيق الذي هو وجود مشاكل مع تسرب الذاكرة في IE 6.
إصلاح تسرب الذاكرة في 5 خط نموذج التعليمات البرمجية التي يوضح المشكلة سهلة.
ولكن إذا كان لدي ضخم جدا في التطبيق ، حيث يجب أن تبدأ من ؟
المحلول
تحقق من بالتنقيط.التي عادة ما يأخذ التخمين من أي تسرب الذاكرة.
إذا كان لسبب بالتنقيط لا تجد ذلك ، نلقي نظرة فاحصة على أي شفرة جافا سكريبت التي تعمل مع الأحداث.هو دائما تقريبا المصدر أي تسرب الذاكرة في المتصفح.
تدمير عنصر DOM مع معالجات تعلق على ذلك ، دون إزالة تلك معالجات الأولى, ومنع الذاكرة المرتبطة بتلك معالجات من يتم استردادها.
نصائح أخرى
هل تطبيق استخدام الكثير من جافا سكريبت ؟
إذا كان كذلك ، ثم شيء واحد لقد وجدت أن يساعد على تجنب تسرب الذاكرة هو التأكد من أن كنت تستخدم جافا سكريبت الإطار مثل النموذج أو مسج لأنها مجربة التعامل مع الحدث البرمجية التي لا تسرب الذاكرة.
- IE6 يمكن أيضا تسرب الذاكرة إذا كان لديك المراجع الدائرية إلى كائنات 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.