Sayfanın bellek kullanımını bulmak için jQuery veya javascript


100

Bir web sayfası veya jquery uygulamam tarafından ne kadar bellek kullanıldığını öğrenmenin bir yolu var mı?

Durumum şu:

Bir jquery ön ucu ve JSON'da veri sunan dinlendirici bir arka uç kullanarak veri ağırlıklı bir web uygulaması oluşturuyorum. Sayfa bir kez yüklenir ve ardından her şey ajax aracılığıyla gerçekleşir.

Kullanıcı arayüzü, kullanıcılara kullanıcı arayüzünde birden çok sekme oluşturmanın bir yolunu sağlar ve her sekme çok sayıda veri içerebilir. Oluşturabilecekleri sekme sayısını sınırlamayı düşünüyorum, ancak bunları yalnızca bellek kullanımı belirli bir eşiğin üzerine çıktığında sınırlamanın iyi olacağını düşünüyordum.

Cevaplara dayanarak, bazı açıklamalar yapmak istiyorum:

  • Bir çalışma zamanı çözümü arıyorum (yalnızca geliştirici araçları değil), böylece uygulamam bir kullanıcının tarayıcısındaki bellek kullanımına dayalı eylemleri belirleyebilir.
  • DOM öğelerini veya belge boyutunu saymak iyi bir tahmin olabilir, ancak olay bağlamayı, verileri (), eklentileri ve diğer bellek içi veri yapılarını içermediği için oldukça yanlış olabilir.

Web uygulamanızı kullanırken bellek sorunları olup olmadığını belirlemek için web uygulamanızın kullanıcı türünü araştırmalısınız. Veya web uygulamanızda bellek / performans sorunları mı yaşıyorsunuz?
Prutswonder

@Prutswonder: Hayır sorun yaşamıyorum, ancak böyle bir aracın var olup olmadığını merak ettim. Sadece sekmelerde sabit bir sınır belirlemek yerine, dinamik bir yöntemin harika olabileceğini düşündüm.
Tauren

Bir derleme zamanı çözümü değil, bir çalışma zamanı çözümü aradığımı açıklığa kavuşturmak için soruya bazı ek ayrıntılar ekledim.
Tauren

2
Sadece bir soru, eğer bir şey önceden önbelleğe alınmışsa, bu yine de sayılır mı?
ajax333221

Yanıtlar:


67

2015 Güncellemesi

2012 yılında, kullanımda olan tüm büyük tarayıcıları desteklemek istiyorsanız, bu mümkün değildi. Ne yazık ki, şu anda bu hala yalnızca Chrome özelliğidir (standart dışı bir uzantısı window.performance).

window.performance.memory

Tarayıcı desteği: Chrome 6+


2012 Cevap

Bir web sayfası veya jquery uygulamam tarafından ne kadar bellek kullanıldığını öğrenmenin bir yolu var mı? Bir çalışma zamanı çözümü arıyorum (sadece geliştirici araçları değil), böylece uygulamam bir kullanıcının tarayıcısındaki bellek kullanımına dayalı eylemleri belirleyebilir.

Basit ama doğru cevap hayır . Tüm tarayıcılar bu tür verileri size açıklamaz. Ve bence bu fikri bırakmalısınız çünkü "el yapımı" bir çözümün karmaşıklığı ve yanlışlığı, çözdüğünden daha fazla sorun ortaya çıkarabilir.

DOM öğelerini veya belge boyutunu saymak iyi bir tahmin olabilir, ancak olay bağlamayı, verileri (), eklentileri ve diğer bellek içi veri yapılarını içermediği için oldukça yanlış olabilir.

Fikrinize gerçekten bağlı kalmak istiyorsanız, sabit ve dinamik içeriği ayırmalısınız.

Sabit içerik, kullanıcı eylemlerine (komut dosyaları, eklentiler, vb. Tarafından kullanılan bellek) bağlı değildir. Diğer
her şey dinamik olarak kabul edilir ve sınırınızı belirlerken ana odak noktanız olmalıdır.

Ancak bunları özetlemenin kolay bir yolu yok. Tüm bu bilgileri toplayan bir izleme sistemi uygulayabilirsiniz . Tüm işlemler uygun izleme yöntemlerini çağırmalıdır. Örneğin:

İzleme sistemini veri ayırmalarınız hakkında jQuery.databilgilendirmek için sarma veya üzerine yazma yöntemi .

İçerik ekleme veya çıkarma da izlenecek şekilde html işlemlerini sarın ( innerHTML.lengthen iyi tahmindir).

Büyük bellek içi nesneleri tutarsanız, bunlar da izlenmelidir.

Olay bağlamaya gelince, olay yetkilendirmesini kullanmalısınız ve daha sonra bu biraz sabit bir faktör olarak da düşünülebilir.

Bellek gereksinimlerinizi doğru bir şekilde tahmin etmeyi zorlaştıran bir başka husus, farklı tarayıcıların belleği farklı şekilde tahsis edebilmesidir (Javascript nesneleri ve DOM öğeleri için).


innerHTML.lengthAyrıca işlemek için bellek veya RAM veya CPU (veya başka bir şey, hiçbir fikrim yok) almıyor mu ?
mrReiha

Bu özellik için tarayıcı desteği IE9 + veya Chrome dışında bir şey DEĞİLDİR. Window.performance.memory yalnızca Chrome'dur. docs.webplatform.org/wiki/apis/timing/properties/memory
Blunderfest

Haklısın, hafızanın navigasyon zamanlama standardının ve window.performancenesnenin bir parçası olduğunu sanıyordum . Eski "desteklenen" girişleri bu standart için uygulanabilirdi. Chrome tarafından standart olmayanwindow.performance.memory bir uzantı olarak kabul edilir.
gblazex

Window.performance.memory aracılığıyla gerçek zamanlı bellek izlemeyi etkinleştirmek için, Chrome'u --enable-exact-memory-info işaretiyle başlatmanız gerekir.
kluverua

Güncelleme: Opera da bunu destekliyor. Kaynak: Mozilla. developer.mozilla.org/en-US/docs/Web/API/…
HoldOffHunger

39

Navigasyon Zamanlama API'sini kullanabilirsiniz .

Gezinme Zamanlaması, web'deki performansı doğru şekilde ölçmek için bir JavaScript API'sidir. API, sayfada gezinme ve yükleme etkinlikleri için yerel olarak doğru ve ayrıntılı zamanlama istatistikleri elde etmenin basit bir yolunu sağlar.

window.performance.memory JavaScript bellek kullanım verilerine erişim sağlar.


Önerilen Kaynaklar


Harika bir öneri. Teşekkür ederim.
MaximOrlovsky

22

Bu soru 5 yaşında ve hem javascript hem de tarayıcılar bu süre içinde inanılmaz bir şekilde gelişti. Bu artık mümkün olduğundan (en azından bazı tarayıcılarda) ve bu soru Google'ın "javascript hafıza kullanımını göster" in ilk sonucu olduğundan, modern bir çözüm sunabileceğimi düşündüm.

memory-stats.js: https://github.com/paulirish/memory-stats.js/tree/master

Bu komut dosyası (herhangi bir sayfada istediğiniz zaman çalıştırabilirsiniz) sayfanın mevcut bellek kullanımını gösterecektir:

var script=document.createElement('script');
script.src='https://rawgit.com/paulirish/memory-stats.js/master/bookmarklet.js';
document.head.appendChild(script);


1
Bu, sayfa belleği kullanımını değil, JS bellek kullanımını bildiriyor gibi görünüyor, Chrome'un yerleşik Görev Yöneticisi, Gmail'in 250 MB kullandığını, memory-stats.js ise 33,7 MB
Brandito

Bookmarklet.js'nin github sayfası için herhangi bir lisans listelenmemiş, bu yüzden muhtemelen telif hakkı alınmış, fikri mülkiyettir. Bu, o projeye bağlı olarak bir derece belirsizlik bırakır.
HoldOffHunger

8

Tarayıcı tarafından gerçekten ne kadar bellek kullanıldığını bulmanın bir yolunu bilmiyorum, ancak sayfadaki öğelerin sayısına bağlı olarak bir buluşsal yöntem kullanabilirsiniz. Uinsg jQuery, yapabilirsiniz $('*').lengthve bu size DOM öğelerinin sayısını verecektir. Dürüst olmak gerekirse, bazı kullanılabilirlik testleri yapmak ve desteklemek için sabit sayıda sekme bulmak muhtemelen daha kolaydır.


3
@tvanfosson: kötü bir fikir değil, ancak bu bana .data () ve bellek veri yapıları gibi DOM dışı bellek hakkında bilgi vermeyecek. Ancak kullanabileceğim toplam ağırlık hakkında iyi bir tahmin verebilir.
Tauren

4

Kullanım Krom Öbek Anlık aracı

MemoryBug adında bir Firebug aracı da var ama henüz olgunlaşmamış gibi görünüyor.


@Pablo: Teşekkürler. Kesinlikle geliştirme araçlarını kullanacağım, ancak çalışma sırasında her kullanıcının tarayıcısındaki bellek kullanımını bulmak için kullanabileceğim bir şey bulmayı umuyordum.
Tauren

3

Yalnızca test için görmek istiyorsanız, Chrome'da geliştirici sayfası aracılığıyla bellek kullanımını izlemenin bir yolu vardır, ancak bunu doğrudan javascript'te nasıl yapacağınızdan emin değilsiniz.


@Zachary: Teşekkürler. Kesinlikle geliştirici araçları kullanacağım, ancak bir çalışma zamanı analizi çözümü bulmayı umuyordum.
Tauren

1
Birini bulursan bana haber ver, elimde bir tane olmasını çok isterim
Zachary K

3

Diğer cevaplardan tamamen farklı bir çözüm önermek istiyorum, yani uygulamanızın hızını gözlemlemek ve tanımlı seviyelerin altına düştüğünde ya kullanıcıya sekmeleri kapatmak için ipuçları göster ya da yeni sekmelerin açılmasını devre dışı bırakmak. Bu tür bilgileri sağlayan basit bir sınıf örneğin https://github.com/mrdoob/stats.js'dir . Bunun dışında, bu kadar yoğun bir uygulamanın tüm sekmeleri ilk etapta bellekte tutması akıllıca olmayabilir. Örneğin, yalnızca kullanıcı durumunu korumak (kaydırma) ve son iki sekme hariç her seferinde tüm verileri yüklemek daha güvenli bir seçenek olabilir.

Son olarak, webkit geliştiricileri javascript'e bellek bilgisi eklemeyi tartışıyorlar, ancak neyin açığa çıkarılmaması gerektiği konusunda bir dizi tartışmaya girdiler. Her iki durumda da, bu tür bilgilerin birkaç yıl içinde mevcut olması pek olası değildir (ancak bu bilgi şu anda çok yararlı değildir).


1

Benzer bir projeye başlarken benim için mükemmel soru zamanlaması!

Daha yüksek düzeyde ayrıcalıklar gerektireceğinden uygulama içi JS bellek kullanımını izlemenin kesin bir yolu yoktur. Yorumlarda belirtildiği gibi, tüm öğelerin sayısını vb. Kontrol etmek, bağlı olayları vb. Görmezden geldiği için zaman kaybı olur.

Bellek sızıntıları görünürse veya kullanılmayan öğeler devam ederse bu bir mimari sorun olabilir. Kapalı sekmelerin içeriğinin olay işleyicileri vb. Kalmadan tamamen silindiğinden emin olmak mükemmel olur; Bittiğini varsayarsak, bir tarayıcıda yoğun kullanımı simüle edebilir ve sonuçları bellek izlemeden çıkarabilirsin ( about: adres çubuğuna bellek yazın )

İpucu: Aynı sayfayı IE, FF, Safari ... ve Chrome'da açarsanız; ve about: Chrome'daki memory'ye gitmek yerine, diğer tüm tarayıcılarda bellek kullanımını raporlayacaktır . Düzgün!


0

Yapmak isteyebileceğiniz şey, sunucunun o oturum için bant genişliğini takip etmesini sağlamaktır (onlara kaç bayt veri gönderildi). Sınırı aştıklarında, ajax aracılığıyla veri göndermek yerine, sunucu, kullanıcıya çok fazla veri kullandığını söylemek için javascript'in kullanacağı bir hata kodu göndermelidir.


@incrediman: Bu da harika bir fikir, ancak birçok izleme özelliği oluşturmadan işe yarayacağını düşünmüyorum - sadece bir bayt sayısı işe yaramaz. Sorun, bir sekmedeki verilerin, kullanıcının birçok farklı şekilde filtreleyeceği ve sıralayacağı bir liste olmasıdır. Her değişiklik yaptıklarında, sunucudan yeni veriler alınacak ve mevcut dom öğelerinin yerini alacak. Ayrıca, "yeniden yükleme" ye basmadıkları ve yeni bir sayfayla başladıkları ne söyler? 304'leri ve benzerlerini izlemem gerekirdi, ancak sadece statik html sunmayı düşünüyorum, tüm veriler bir REST hizmetinden geliyor.
Tauren

Bu yaklaşım, istemci bellek kullanımını etkileyebilecek createElement () veya remove () ile oluşturulan veya yok edilen öğeleri hesaba katmaz. Ancak diğer cevaplardan ilginç bir şekilde farklıdır (istemci tarafında değil sunucu tarafında ölçüldüğünde, ölçümleriniz hafızayı değiştirmez, diğer cevapların yapacağı gibi).
HoldOffHunger

0

Document.documentElement.innerHTML dosyasını alabilir ve uzunluğunu kontrol edebilirsiniz. Size web sayfanız tarafından kullanılan bayt sayısını verecektir.

Bu, tüm tarayıcılarda çalışmayabilir. Böylece tüm vücut öğelerinizi dev bir div içine alabilir ve bu div'de innerhtml'yi çağırabilirsiniz. Gibi bir şey<body><div id="giantDiv">...</div></body>


4
Oluşturulan innerHTMLdizenin uzunluğunun , tarayıcının HTML'yi işlemek için kullandığı bellekle (örneğin, kendi iç nesne modelinde) yararlı bir şekilde korelasyonu pek olası değildir .
TJ Crowder

ve neden böyle? Mantığım, tarayıcıya bir metin yüklenirse, hafızada saklanması gerektiğidir. Bu, tarayıcı tarafından sayfayı işlemek için kullanılan belleğin bir miktar ölçüsünü verir.
Midhat

4
Bu şekilde düşünün. "Sana 10 milyon dolar vermek istiyorum" dersen, bu 8 kelimedir. Öte yandan, "Peçetenize hapşırmak istiyorum" derseniz bu 7'dir. İlki, ikinciden 8/7 daha mı değerli?
intuited

1
Bu, @tvanfosson'un DOM öğelerinin sayısını alma önerisine benzer. Sizinki muhtemelen biraz daha doğrudur çünkü farklı alan öğeleri farklı miktarlarda metin içerebilir. Ancak yine de data (), tıklama işleyicileri, bellek veri yapıları ve nesneleri vb. Hakkında herhangi bir bilgi almaz. Uygulamam bu özelliklerin çoğunu kullanıyor.
Tauren

1
Kapsamda, belge öğesinin parçası olmayacak, ayrılmış DOM düğümlerine işaret eden JS değişkenleri olabilir. Ayrıca, sayfadaki metni etkilemeden, gerçekten uzun bir dizeyi değişkene yüklemek için kod yazabilir ve gigabaytlarca bellek tüketebilirsiniz.
Josh Ribakoff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.