Soru Visual Studio'daki “View Heap” sonucunun neden 'Process Memory Usage' ile uyuşmaması


Uygulamamdaki bellek kullanımını izlemek için Visual Studio'yu kullanmaya çalışıyorum. 'Teşhis Araçları' penceresinde, uygulamanızın 423 MB olduğunu gösteriyor. Anlık görüntüyü tıklattığımda 'Bellek Kullanımı' ve 'ViewHeap' bölümüne gittiğimde, nesnelerimin büyüklüğüne dair bir tablo alıyorum.

enter image description here

Ama bu sayıyı eklediğimde: = 3317228 + 403764 + 354832 + 264984 + 244836 + 195748 + 144032 + 28840 + 16452 + 13920 + 13888 + 3428 + 2100 + 20 = 5004072 = 4.77 MB

Benim sorum, bu sayı 4.77MB neden "Bellek" grafikte gördüğüm 423MB ile uyuşmuyor. Soldaki tabloyu 423 MB'nin nereye gittiğine dair bir dökümü görmeyi bekliyorum. Lütfen neyi kaçırdığımı söyle?


21
2018-06-02 19:21


Menşei


Bu değerlerden hiçbiri (en azından Visual Studio 2015 RC'de) sürecin aldığı özel belleğe özellikle uygun değildir. Her ikisi de, performans karşılaştırması için değil, uygulamanızda potansiyel bellek sorunlarını kolayca algılamanızı sağlamayı amaçlamaktadır. Görev Yöneticisi'ne bakarsanız, orada ayrılan değer muhtemelen farklıdır. her ikisi de bu değerlerin Örneğin, grafikte 21,5 MB, yığınta 92.3KB ve belirli bir uygulama için Görev Yöneticisi'nde 4,200 KB vardı. - 202_accepted
Teşekkürler. Fakat hesapladığım sayı 4,77 MB'tır, bu da 'bellek' grafiğindeki sayıdan (423MB) daha kapalıdır. 10X kapalıdır. Bu da normal mi? - n179911
Mine (92.3KB)% 233 oranında değer kaybetti. Kullanman gerektiğine inanıyorum hata ayıklama olmadan tanılama araçlarını başlatın seçeneği. Hata ayıklama araçları, kullanırken F5 tanı araçlarıyla çalışmak için hata ayıklayıcı. Ayrıca, herhangi paylaşımsız veri (I.e yüklenen türler, vb.) Memory (MB) grafik, olduğu gibi özel işlem belleği. - 202_accepted


Cevaplar:


Görünüm Yığını boyutu neden bellek grafik boyutuyla eşleşmiyor?

Bunun için düzinelerce potansiyel nedeni var. jitter, Hata Ayıklama Araçları, Hata Ayıklama Sembolleri, Sadece benim kod, Çöp toplama ve diğ. Büyük olanlardan iki tane geçeceğiz.

Sadece benim kod

Sadece benim kod Visual Studio özelliği eğilimindedir saklamak Kullanıcıdan gelen, bir yüklemeden hariç tutulan ayrıntılar, istisnalar, kesme noktaları ve diğer kod olmayan meta veriler .PDB dosya veya açık bir proje. Görmek MSDN Sadece Benim Kodum detaylar için.

Hata Ayıklama Sembolleri ve Araçları

Hata ayıklama yaparken herhangi Visual Studio'da proje, Visual Studio Hata Ayıklayıcı çalışır ve izin vermek için fazladan bellek ayırır. kırılma noktaları, istisna yakalamakve diğer özellikler. İçin doğru tanılama araçları yakalama, kullanmalısınız Alt+F2 seçenek veya Hata ayıklama> Hata ayıklama olmadan tanılama araçlarını başlat .... Ayrıca geçiş yapmak isteyeceksiniz Serbest bırakmak Bu bölüm için mod. Bu adım tek başına grafiğin (benim için) gösterdiği belleği kesti. 21.5MiB için 5.5MiB, ki Hata Ayıklama Sembolleri ve Hata ayıklama araçları bir önemli faktörü. Visual Studio'nun istisnaları, kesme noktalarını ve diğer verileri yakalayabilmesi için bunu unutmayın. şart Kendinizi sürecinize ve sürecinizdeki tüm nesnelere iliştirin.

Peki, bu sayıları nasıl eşleştiriyoruz?

Gerçekten yapmamalısın endişelenmek eşleşen sayılarla ilgili. Bellek Grafiğinin ve Görünüm Yığın grafiğinin amacı, programın yanlışlığını gösterebilecek ani ve tek bellek dalgalanmalarını görmenize izin vermektir. İki değer arasındaki farka odaklanmak yerine, bunları aramalısınız.

Bu, almak için atabileceğiniz bazı adımlar var dedi doğru Sonuçlar.

Sayıları Gerçekten Eşleştirme

Eğer sen gerçekten Onları eşleştirmek istiyorum, istediğiniz şekilde yapılabileceğini düşünmüyorum. Bununla birlikte, daha yakın olabilirsiniz. İlk adım Hata ayıklama olmadan tanılama araçlarını başlatın ...sonra seç Hafıza kullanımı. Seçildikten sonra Ayarları dişli yanında, ve emin olun Profiler Türü olduğu Mixed (Managed and Native). Ardından, tıklayın başla ve biraz al anlık böylece hafıza kullanımını inceleyebilirsiniz. Bittiğinde, hata ayıklamayı durdurun ve hafızanızı inceleyin.

Belleğinizi incelemek için Sol üst İncelemek istediğiniz anlık görüntü için anlık görüntü kutusundaki mavi sayı. Bu sayfada, Izgara Simgesi üzerinde sağ üst ve ikisinin de seçimini kaldırın Sadece benim kod ve Küçük Nesneleri Daralt. Şuna geçin Yerel Yığın sekme ve aynı şeyi yapma, seçimini kaldırma Sadece benim kod ve sonra Serbest Tahsisleri Dahil Et'i seçin.

Bunu tek başına, hatayı gerçek değere yaklaştırır. (Gerçek değer Özel Bayt ve hata Yığın Boyutu) Test ettiğim uygulama ile toplamı (her iki yığıntan) 1.0265MiBile gösterilen tahsis ile aynıydı Görev Yöneticisi programı Visual Studio'nun dışında çalıştırdığımda (bu gerçek değer 1.1211MiBancak bu küçük sayı ile hata payı bekleniyor.

Nedir Serbest Tahsisleri Dahil Et anlamına gelmek? Aslında, ne zaman GC hafızayı temizler, hafıza hemen kaldırılmamış uygulama alanı. Bunun yerine başka nesneler tarafından kullanılmak üzere serbest bırakılır, ancak hala uygulama ile kalır. Çöp toplama karmaşık bir konudur ve bu sorunun ve yanıtın çok ötesinde.

ek Notlar

Bellek ayırma, kullanım ve ölçüm bir çok karmaşık konu. Ne yazık ki, bu gibi durumlarla başa çıkabilmek için% 100 daha çok fool korumalı bir yol yoktur ve genellikle daha aptalca ve doğru olan çözüm, daha karmaşık, yavaş ve kullanımı zor olan bir durumdur.

Referanslar

MSDN Sadece Benim Kodum: https://msdn.microsoft.com/en-us/library/dn457346.aspx#BKMK__NET_Framework_Just_My_Code

MSDN Çöp Toplama: https://msdn.microsoft.com/en-us/library/0xy59wtx%28v=vs.110%29.aspx

Bu cevabın geri kalanı dayanmaktadır kendi deneyimlerim ve Deneme ve hatave sonuçlanabilecek potansiyel hatalara tabidir. farklı ortamlar. Burada sunulan adımlar olmayabilir tüm geliştiriciler için çalışın ve Visual Studio 2015 RC versiyon 14.0.22823.1 D14REL.


25
2018-06-02 20:26





Grafik, tüm süreç için Özel Baytları gösterir. Bu Yönetilen yığın, yerel yığın, yığınlar, vb içerir ... Bellek metrikleri türleri hakkında daha fazla bilgi için bu cevabı bakın: Özel baytlar, sanal baytlar, çalışma kümesi nedir?

Yığın Görünümü tablosu, yalnızca anlık görüntü alınırken Yönetilen yığında etkin olan türleri (çöp toplanamaz) gösterir. Hem yerel hem de yönetilen yığınlarda türleri görmek için karışık mod hata ayıklamaya geçin. Yığın Görünümü (ve anlık görüntü tablosundaki sayı), grafikte gösterilen işlem belleğinin bir alt kümesidir.

Hata ayıklayıcı tümleşik araç, bellekte beklenmedik bir büyümenin nedenini bulmaya çalışmak veya çöp toplanması gereken nesneleri izlemek, ancak bunları hala canlı tutmaya devam eden referanslara sahip olmak için en iyi şekilde çalışır.

İşte benim yazdığım (MSFT için çalışıyorum) bir bellek yazımı olan ve güncel olmayan referansları olan nesneleri nasıl izleyeceğimi açıklayan Bellek aracı: http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/29/diagnosing-event-handler-leaks-with-the-memory-usage-tool-in-visual-studio-2015.aspx


4
2017-07-25 21:51