7

Düğme tıklatıldıktan sonra web çalışanını çağıran bir uygulamanız var. Hesaplamalar, kullanıcı arayüzünü rahatlatmak ve hesaplamalar yapılırken kullanıcı eylemlerine duyarlı hale getirmek için işçiye taşınır.Web Çalışanlarını Kullanarak Olası Bellek Kaçakları (Çöp Toplayıcı)

Her şey yolunda gider ve yaklaşık 0.8-1.5s sonra işçi bir yanıt gönderir. Worker.onmessage'de gereken tüm DOM eylemlerini gerçekleştiriyorum. Ancak bu GC görüntülendikten ve CPU'ya bağlı olarak UI'yi 2 veya daha fazla saniye boyunca engelledikten sonra. Bu gerçekten kafa karıştırıcı, çünkü UI engelleme yapmak istediğim şey.

Burada zaman çizelgesi/bellek konsol sekmesinin ekran görüntüsü: http://i.imgur.com/zUoHa.jpg

GC olaylar sadece tüm DOM manipülasyonlara sonra meydana görebileceğiniz gibi. Aslında sadece tek bir repaint olayı var (DocumentFragment kullanılıyor).

ana js kodu:

var sortWorker = new Worker('js/contactsorter.js'); 
sortWorker.onmessage = function(e) { 
    var messages = []; 
    e.data.forEach(function(userDoc) { 
     var contactSection = _drawContact(userDoc); 
     messages.push(contactSection); 
    }); 

    meta.append(messages); // this actually appends document fragment as a child 
}; 

sortWorker.postMessage(postMessageData); 

contactsorter.js (işçi):

onmessage = function(e) { 
    var uid, output = [], usersStat = {}; 

    // calculations... 

    postMessage(output); 
    close(); 
}; 

bu yerde ya da olmasın bu GC olayları önlemek için herhangi bir yolu var mı?

UPD: o GC olay (lar) zaman işçiye gönderildiği veri miktarına bağlıdır geliyor bana. UPD2: Kapatma ve önyüklemeden sonra GC olayları sadece iki kez gerçekleşir, böylece bir saniyeden daha az bir süre için kullanıcı arayüzünü engeller. Hımm?

+0

Nesneler ne kadar büyük? Kaç? Ne tür sayılarla konuşuyoruz? Hangi DOM düğümlerini oluşturuyorsunuz? GC olay ölçeği, sıralanan kişi sayısı ile doğrusal olarak mı? –

+0

JSON.stringify, yaklaşık 2M olduğunu söylüyor. Bunlar, çocukları olarak nesneleri olan nesneler. Çalışan yanıtından sonra (bir dizi çıkarır) DocumentFragment oluşturup yakl. Bunun için 400 "div" elemanları. Sonrasında DOM'a parça ekliyorum. Son soruyla ilgili olarak - testi yapmak için kodumu yeniden yazmam gerekiyor, bu yüzden bunu biraz sonra tekrar yorumlayacağım.Btw: yeni UPD –

+0

Son soruyla ilgili olarak: Hayır, GC olayı veri miktarına göre ölçeklenmez. Üstelik, bu zaman dilimi için zaman çizelgesine bakarken http://i.imgur.com/psGpr.png zaman çizelgesinde bile bulamıyorum. –

cevap

3

bir şey Web İşçileri ile hatırlamak ve onları örnekte kullanılan olduğu gibi özellikle de sen o görevliye üzerinde gönderirken nesneyi klonlama olmasıdır için. Yani saçma bir örnekle akmasına izin:

  1. büyük nesneyi yapın (eğer 2M vay ... wtf ... yorumunda söyledi) - 2M ana iş parçacığı 2M işçiye
  2. Post içinde tahsis ne olursa olsun ekstra ana hala iplik artı ardından işçiye kapalı, senin nesne/dizi JSONify için ana iş parçacığı açısından tüylere olarak oluşturulduğu yerlerde işçinin o enayi üzerinde 2M işçi yay içinde
  3. Chug ... ana iş parçacığı burada 2M + sadece GC için beklemek etrafında oturmak, şimdi olabilir, olmayabilir ... belirli bir miktardaki yeni nesil nesneler, yeni nesnelerin ve dom öğelerinin bir tonunun yaratılmasından sonra veya sonra yaratıldığı gibi, eşik değeri tetikledikten sonra tetikler: D
  4. İşçi bir mesajla geri dönüyor, yeni bir 2M (yay) için ana iş parçacığında artık yeni yapılmış olan 2M'nin, artı nesnenin JSONify'ı için gerekli olan kabarık bellek nesnelerinin ne olduğunu ... farz edelim. Bunun nereye gittiğini görüyorsunuz. Bunun bir krom uygulaması (başka comment), o zaman belki Sahası, transfer nesneleri seni kullanmak geçici nesneler vb oluşturulmasını Klonlama nesneyi önlemek için Transferable Objects faydalanmak için kodunuzu yeniden yapılandırabilir olduğunu söyledi yana

Bir dizi arabellek olarak yeniden yapılandırılmalı ve bu tamamen karanlık bir sihir.

+0

* "Yorumda 2M dediniz ... wtf ... vay" * - Grafikler, ses veya analiz yazılımı gibi uygulamalar için çok daha büyüktür. Aktarımlar kullanmadan 12 GB (!) Dizileri burada geçemiyorum. –

+0

@JohnWeisz - Son zamanlarda, aynı zamanda WebAudio vb. Ile daha büyük nesneleri rutin olarak kullanıyorum. Ama 2013'ün sonlarına doğru geri dönüş makinesinde çok fazla görünüyordu. Bence asıl problemi, geçici nesnelerin bir sürü yaratılmasıyla ve döngülerinin ya da haritacılarının bir parçası olarak ... DOM'da yaptıklarının bilincinde olmaktan çok daha fazlası vardı. –

İlgili konular