Bu sorunun kısa cevabı , bu değerlerin hiçbirinin bir yürütülebilir dosyanın gerçekten ne kadar bellek kullandığının güvenilir bir göstergesi olmadığı ve hiçbirinin bir bellek sızıntısını ayıklamak için gerçekten uygun olmadığıdır.
Özel Baytlar , işlem yürütülebilir dosyasının istediği bellek miktarını ifade eder - gerçekte kullandığı miktarı değil . Bunlar "özel" dir, çünkü (genellikle) bellek eşlemeli dosyaları (yani paylaşılan DLL dosyaları) hariç tutarlar. Ancak - işte yakalama - bu dosyalar tarafından ayrılan belleği mutlaka dışlamazlar . Özel baytlardaki bir değişikliğin yürütülebilir dosyanın kendisinden mi yoksa bağlantılı bir kitaplıktan mı kaynaklandığını anlamanın bir yolu yoktur. Özel baytlar da sadece fiziksel bellek değildir ; diske veya bekleme sayfası listesinde (sayfa artık kullanılmamaktadır, ancak henüz sayfalandırılmamıştır) sayfalanabilirler.
Çalışma Kümesi , işlem tarafından kullanılan toplam fiziksel belleği (RAM) ifade eder . Bununla birlikte, özel baytlardan farklı olarak, bu, bellek eşlemeli dosyalar ve diğer çeşitli kaynakları da içerir, bu nedenle özel baytlardan daha da hassas bir ölçümdür. Bu, Görev Yöneticisi'nin "Mem Usage" bölümünde bildirilen değerle aynıdır ve son yıllarda sonsuz miktarda kafa karışıklığı kaynağı olmuştur. Çalışma Kümesindeki bellek, bir sayfa hatası olmadan adreslenebilmesi bakımından "fiziksel" dir; Ancak bekleme sayfa listesi de hala fiziksel olarak hafızada ancak çalışma kümesinin bildirilen ve bir uygulamayı minimize aniden bırak "Mem Kullanımı" ibaresini görebilirsiniz nedeni budur.
Sanal Baytlar , tüm işlem tarafından kullanılan toplam sanal adres alanıdır . Bu, bellek eşlemeli dosyalar (paylaşılan DLL'ler) içerdiği için çalışma kümesine benzer, ancak bekleme listesindeki verileri ve zaten disk belleği olan ve diskteki bir sayfa dosyasında oturan verileri de içerir. Ağır yük altındaki bir sistemdeki her işlem tarafından kullanılan toplam sanal bayt, makinenin sahip olduğundan önemli ölçüde daha fazla bellek ekleyecektir.
Yani ilişkiler:
- Özel Baytlar, uygulamanızın gerçekten ayırdığı şeydir, ancak sayfa dosyası kullanımını içerir;
- Çalışma Kümesi, disk belleği olmayan Özel Baytlar artı bellek eşlemeli dosyalardır;
- Sanal Baytlar Çalışma Kümesi artı sayfalandırılmış Özel Baytlar ve bekleme listesidir.
Burada başka bir sorun daha var; Paylaşılan kütüphanelerin uygulama modülünüzde bellek ayırabilmesi ve uygulamanızın Özel Baytlarında bildirilen olası yanlış pozitiflere yol açması gibi , uygulamanız da paylaşılan modüllerin içinde bellek tahsis edebilir ve bu da yanlış negatiflere yol açabilir . Bu, uygulamanızın Özel Baytlarda hiç kendini göstermeyen bir bellek sızıntısına sahip olmasının mümkün olduğu anlamına gelir. Olası değil, ama mümkün.
Özel Baytlar, yürütülebilir dosyanızın kullandığı bellek miktarına makul bir yaklaşımdır ve bellek sızıntısı için olası adayların bir listesini daraltmaya yardımcı olmak için kullanılabilir ; sayının sürekli ve sonsuz bir şekilde büyüdüğünü ve büyüdüğünü görürseniz, bu süreci bir sızıntı açısından kontrol etmek istersiniz. Ancak bu, bir sızıntı olduğunu ya da olmadığını kanıtlayamaz .
Windows'da bellek sızıntılarını tespit etmek / düzeltmek için en etkili araçlardan biri aslında Visual Studio'dur (bağlantı, ürün sayfası için değil, bellek sızıntıları için VS'yi kullanma sayfasına gider). Rasyonel Arındırmak başka bir olasılıktır. Microsoft ayrıca bu konuda daha genel bir en iyi uygulamalar belgesine sahiptir . Bu önceki soruda listelenen daha fazla araç var .
Umarım bu birkaç şeyi temizler! Bellek sızıntılarını takip etmek, hata ayıklamada yapılması en zor şeylerden biridir. İyi şanslar.