.NET Yetersiz Bellek İstisnası - 1.3 GB kullanıldı ancak 16 GB yüklü


91

Uygulamanın bellek kullanımı yaklaşık 1,3 GB'ı aştığında c # uygulamamda Bellek Yetersiz istisnası alıyorum.

Aynı sorunu 3 gb belleğe sahip 32-bit bir makinede yaşadım ve o zamanlar mantıklıydı, ancak şimdi donanımı, yüksek kaliteli anakart ve RAM ile 64-bit bir makineye yükselttim. 1.3GB'tan sonra istisna hala devam ediyor!

2GB üzerinde tek bir nesne olmadığını ve 1.3'ün zaten 2GB'den daha az olduğunu biliyorum, bu nedenle tek bir nesnedeki yerleşik MS 2GB sınırı büyük olasılıkla sorun olmayacak ...

Bir uygulama belirli bir bellek kullanım eşiğine ulaştığında bir çeşit Windows kapatma anahtarı var gibi görünüyor ... O zaman bunu yapılandırmanın bir yolu kayıt defterinde olabilir mi?

Herhangi bir yardım çok takdir edilecektir!


9
OS 64bit'iniz de mi?
2013

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

Yanıtlar:


90

Aynı hedef mimariye göre derleyene kadar hiçbir fark yoktur . Ben herhalde sizin için derleme 32her iki durumda da bit mimarisi.

Söz It değerinde OutOfMemoryExceptionsen alırsanız da kaldırılabilir 2GBtek koleksiyon ayrılan belleğin CLR (söz hakkından List<T>mimarileri her ikisi birden) 32ve 64bit.

64Bit mimarisinde bellek iyiliğinden yararlanabilmek için kodunuzu bit mimarisini hedefleyen derlemeniz gerekir 64. Bundan sonra, doğal olarak, ikili programınız yalnızca64 bit üzerinde çalışacak , ancak RAM'de daha fazla alan olması olasılığından yararlanacaktır.


8
AnyCPU ne olacak?
dtb

1
Evet, AnyCPU, JIT mimarisine bağlı kod seçeneğinizin olduğu bir seçenektir. Ancak, yönetilmeyen (örneğin) kaynaklara sahip olduğunuz durumlarda, belirli mimari kalıntıları hedeflemek yine de yararlı olabilir. OP'nin mimarisinin ne hakkında olduğu hakkında hiçbir fikrim yok.
Tigran

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

63

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

Ancak x86'da bir uygulama oluşturmanın gerektiği durumda, bellek sınırını 1,2 GB'den 4 GB'a yükseltmenin bir yolu vardır (bu, 32 bit işlemler için gerçek sınırdır):

Visual Studio kurulum dizininin VC / bin klasöründe bir editbin.exedosya olması gerekir . Yani varsayılan kurulumumda onu altında buluyorum

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

Programın çalışması için belki de vcvars32.batönce aynı dizinde çalıştırmanız gerekir . Sonra bir

editbin /LARGEADDRESSAWARE <your compiled exe file>

programınızın 4GB RAM kullanmasına izin vermek yeterlidir. <your compiled exe file>VS'nin projenizi derlerken ürettiği exe'dir.

Projenizi her derlediğinizde bu davranışı otomatikleştirmek istiyorsanız, yürütülen proje için aşağıdaki Post-Build olayını kullanın:

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

Not: Aynı şey, devenv.exeVisual Studio'nun 1,2 GB yerine 4 GB RAM kullanmasına izin vermek için yapılabilir (ancak önce eskisini yedekleyin devenv.exe).


Çok teşekkürler. Bu benim için çalışıyor. Ancak bellek sınırını 4 GB'a yükselttikten sonra tespit edilen herhangi bir sorun var mı?
Maverick

28

'Herhangi bir CPU' derlemesi için varsayılanın artık '32bit'i tercih et' onay kutusunu işaretlediğinden bahsetmeye değer. AnyCPU'ya ayarlandığında, 16 gb RAM'e sahip 64 bit bir işletim sisteminde, bu kontrol edilirse 2 gb'de hala bir bellek yetersizliği istisnasına çarpabilir.

Prefer32BitCheckBox


2
Bu, bellek
yetersizliğimi

2

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

Ve bu nedenle, işleminiz için mevcut adres alanı hala aynıdır, önceki kurulumunuzdan değişmemiştir.

Hem 64bit OS hem de 64bit .NET sürümüne yükseltin;)


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 bile 32bit olarak çalışıyor olabilir.

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


0

32 bit Windows'unuz varsa, bu yöntem aşağıdaki ayarlar olmadan çalışmaz.

  1. Cmd.exe istemini çalıştırın (önemli: Yönetici Olarak Çalıştır)
  2. bcdedit.exe yazın ve çalıştırın
  3. "İncreuserva" parametrelerine bakın ve ardından aşağıdaki ifadeyi yazın
  4. bcdedit / set artışuserva 3072
  5. ve tekrar 2. adım ve parametreleri kontrol edin

Bu ayarları ekledik ve bu blok başladı.

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

Daha fazla bilgi - komut increaseuserva: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

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.