2013-01-06 33 views
68

Uygulamamın bellek kullanımı yaklaşık 1.3GB bittiğinde benim C# uygulamasında bir Out Of Memory istisnası alıyorum..NET Out Of Memory Exception - 1.3GB kullanıldı ancak 16GB yüklü

Aynı sorun 3gb belleğe sahip 32 bitlik bir makinede vardı ve o zamanlar mantıklı oldu, ancak şimdi donanımı 64 bitlik bir makineye 16GB bellekle yüksek uçlu anakart ve RAM ile yükseltdim ancak Memory Out dışında istisna 1.3GB sonra hala gerçekleşir!

Ben

Öyle görünüyor ... Orada 2GB üzerinde tek nesnelerdir ve 1.3 zaten 2 GB azdır, bu nedenle tek bir nesne üzerinde dahili MS 2GB sınırı problemi olma olasılığı olmadığını biliyoruz Bir uygulama belirli bir bellek kullanım eşiğine ulaştığında bir pencerenin bir tür kill-switch'i gibi ... Sonra belki de bu kayıt defterini yapılandırmak için bir yol olmalı?

Herhangi bir yardım büyük takdir edilecektir!

+9

İşletim sisteminiz 64bit de mi? – fge

+8

İşletim sisteminiz 64 bit olsa bile, işleminizin 64 bit (veya AnyCPU) olduğundan emin olun – Knowleech

+0

.NET sürümü nedir? –

cevap

77

Aynı hedef mimarisine derlemek kadar fark yoktur. Her iki durumda da 32 bit mimarisi için varsayalım varsayalım.

Size hem mimarileri 32 ve 64 bit CLR tek koleksiyon ayrılan belleğin 2GB (diyelim List<T>) alırsanız OutOfMemoryException da kaldırılabilir söylemeden geçmeyelim.

64 bit mimarisine bellek iyilik fayda edebilmek için, kod 64 bitlik mimariye hedefleyen derlemek gerekiyor. Bundan sonra, ikili, sadece bit 64 bit çalışır, ancak daha fazla alan RAM kullanılabilir olasılık yarar sağlayacaktır.

+8

AnyCPU hakkında ne? – dtb

+1

Evet, AnyCPU da JIT mimarisine bağlı kod için bir seçeneğiniz olan bir seçenektir. Ancak, belirli mimariyi hedeflemek, yönetilmeyen kaynaklara sahip olduğunuz durumlarda hala fayda sağlayabilir. OP'nin mimarisi hakkında hiçbir fikrim yok. – Tigran

+4

Bunu biliyordum :) - Teşekkürler Tigran, çözümü x64'te yeniden oluşturdum ve istisna gitti. – Paceman

2

64 bitlik bir kemeriniz var gibi görünüyor - ancak .NET çalışma zamanının 32bit sürümü ve/veya Windows'un 32 bit sürümü.

Ve işleminiz için kullanılabilir olan adres alanı hala aynıdır, önceki kurulumunuzdan değiştirilmemiştir. Bir 64bit işletim sistemi ve 64 bit .NET sürümü hem

Yükseltme;)

1

Uygulamanız 64 veya 32 bit işlem olarak mı çalışıyor? Bunu, görev yöneticisinde kontrol edebilirsiniz.

Tüm sistem 64bit üzerinde çalışıyor olsa da, 32bit olarak çalışıyor olabilir.

32bit ise, üçüncü taraf kitaplığı buna neden olabilir. Ancak önce uygulamanızın yorumlarda belirtildiği gibi "Herhangi bir CPU" için derlendiğinden emin olun.

52

Daha önce de belirtildiği gibi, uygulamayı x64'te derlemek size çok daha fazla kullanılabilir bellek verir. VC

:

Ama bu durumda, bir x 86 bir uygulamayı oluşturmak gerekir

, (gerçek 32 bit işlemleri için üst sınır) 4GB 1,2GB bellek sınırını yükseltmek için bir yol yoktur Visual Studio yükleme dizininin/bin klasörü, bir editbin.exe dosya olmalıdır.Ben programın çalışması için

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe 

altında bulmak varsayılan kurulumda Yani, belki ilk aynı dizinde vcvars32.bat yürütmek zorundadır. Sonra bir

editbin /LARGEADDRESSAWARE <your compiled exe file>

programınız 4GB RAM kullanmasına izin için yeterlidir. <your compiled exe file>, projenizi derlerken VS'nin oluşturduğu exe'dir.

bu davranışı idam proje için aşağıdaki Sonrası Yapı olayını kullanmak, projenizi derlemek her zaman otomatik hale getirmek isterseniz:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
    call "$(DevEnvDir)..\tools\vsvars32.bat" 
    editbin /largeaddressaware "$(TargetPath)" 
) 

Sidenote: Aynı devenv.exe ile yapılabilir Görsel izin Studio ayrıca 1.2GB yerine 4GB RAM kullanır (ancak ilk önce eski devenv.exe'u yedekleyin).

+0

Oldukça düzgün bir çözüm. Teşekkürler; Benim için çalışıyor! – MiBol

+0

Ruhunu kutsa, yazara. Beni kurtardın! – cubrman

+0

Çok teşekkürler. Bu benim için çalışıyor. Ancak bellek sınırını 4 GB'ye yükselttikten sonra tanımlanmış sorunlarımız var mı? – Maverick

10

'Herhangi bir CPU' derlemesi varsayılanı 'Preben 32bit' onay kutusunu işaret ediyor. AnyBGBU'ya ayarlanan, 16GB RAM içeren bir 64 bit işletim sisteminde, eğer kontrol edilirse 2gb'de bellek istisnasının dışına çıkabilirsiniz.

Prefer32BitCheckBox

İlgili konular