2010-11-19 10 views
0

Zaman zaman bellek tükenebilir (2 GB sanal adres alanı) bir 32-bit windows uygulaması üzerinde çalışıyorum. Sanal belleğin WinDbg veya VMMap kullanılarak nasıl ayrıldığına baktığımda, 85 MB'lık bir sanal bellek alanı alan bir dll görüntüsü görüyorum. Spesifik olmak gerekirse, 84 MB bunun ".data" bölümünde ve "Write on write" korumasına sahip. Ancak sabit diske baktığımda dll sadece 81 KB.Sanal bellekte dll görüntüsü, sabit sürücü alanından 1000 kat daha büyük olabilir mi?

dll görüntüsü, sanal adres alanında diskten 1000 kat daha fazla nasıl olabilir? Sadece "Görüntü" hakkında değil, yığınları veya yığınları veya haritalanmış belleği değil, sadece görüntüyü sorduğumu unutmayın - elbette ki yığınların, yığınların, eşlenmiş belleğin vb.

cevap

5

boş .dll oluşturmayı deneyin ve dosya kapsamı bu ekleyin: .bss bölümünde bir girdi ilan etmeli

char global_stuff[84*1024*1024]; 

. Bu, görüntüdeki sıfır başlatılmış verileri tanımlayan bir bölümdür. Bu veriler sıfır olarak başlatıldığından, diskte bir grup sıfır yerine depolandığında ne kadar büyük olması gerektiğini bildirmek oldukça basit bir optimizasyon.

+0

Global_stuff'ı aynen yukarıdaki gibi ekledim, ancak dll'nin .data bölümünü etkilemedi. Dld'de dumpbin çalıştırdığımda, .data'nın 52DB00 (veya ondalık olarak 86,880,256 bayt) olduğunu görüyorum. Global_stuff eklediğimde değişmedi. – Sean

+0

@Sean, dunkbin'i 84k .dll'de de çalıştırdınız mı? – MSN

+0

İlk başta bir exisiting dll denedim ve bir fark görmedim. Şimdi boş bir dll denediğime göre, önerdiğin gibi, ne dediğini görüyorum. Cevabını kabul ediyorum. – Sean

İlgili konular