Middle
Kodunuzda yaddaş sızmasını necə düzəldərdiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Brauzerin inkişaf vasitələrindən (Timeline / Performance, Memory) istifadə edərək sızma mənbəyini müəyyən edərdinizmi?
Yaddaş sızmalarının ümumi səbəbləri:
- Obyektlərə asılı qalmış referanslar:
- Unudulmuş zamanlayıcılar (
setInterval,setTimeout) obyektlərə istinad edir. - Aydın olmayan hadisə idarəediciləri, onlar ayrılmayıb (
removeEventListener). - Xarici dəyişənləri daha uzun müddət saxlayan bağlamalar.
- Sənəddən silinmiş DOM elementləri, lakin JavaScript-də referanslar qalıb.
- Unudulmuş zamanlayıcılar (
// Unudulmuş zamanlayıcı səbəbindən sızma nümunəsi
const leakyObject = {
data: 'some data'
};
setInterval(() => {
console.log(leakyObject.data); // leakyObject toplanmayacaq
}, 1000);
- Böyük məlumat strukturları:
- Döngü və ya axın ilə həll edilə biləcək çox böyük massivlər və ya obyektlər yaratmaq və saxlamaq.
- Keshlərin düzgün istifadə olunmaması:
- Sonsuz böyüyən keshlər (LRU, LFU və s.)
- Xarici kitabxanalardan sızmalar:
- Kitabxanaların sənədlərini və ya mənbə kodunu potensial problemlər üçün yoxlayın.
Həll:
- Hadisələri və zamanlayıcıları ləğv edin: Bütün hadisə idarəedicilərinin ayrıldığından və zamanlayıcıların təmizləndiyindən əmin olun.
// Düzgün zamanlayıcı təmizləmə
const leakyObject = {
data: 'some data'
};
let timerId;
function startTimer() {
timerId = setInterval(() => {
console.log(leakyObject.data);
}, 1000);
}
function stopTimer() {
clearInterval(timerId); // Zamanlayıcıyı təmizləyin
}
- Referansları null edin: Böyük və ya istifadə olunmayan obyektlərə referansları açıq şəkildə null edin ki, toplayıcı onları toplaya bilsin.
WeakMapvəWeakSetistifadə edin: Toplayıcı tərəfindən silinə bilən obyektlərə referans saxlamaq üçün.- Məlumat strukturlarını optimallaşdırın: Daha səmərəli strukturlar və ya yanaşmalar istifadə edin (məsələn, tənbəl yükləmə).
- Keshlərin ölçüsünü məhdudlaşdırın: Çıxarılma strategiyalarını tətbiq edin.
- Kitabxanaları yeniləyin və ya dəyişdirin: Əgər problem xarici kitabxanada isə, onu yeniləyin və ya alternativ tapın.
Təmir etdikdən sonra, sızma olmadığını təsdiqləmək üçün inkişaf vasitələrindən istifadə edin.