2009-06-01 15 views
26

'u ayırabilir Çöp toplayıcısını bir .NET işlemi için ayırabileceği maksimum bellek nedir? X64 derlediğimde, Process.GetCurrentProcess.MaxWorkingSet, yaklaşık 1,4GB döndürür, ancak AnyCPU (x64) derlediğimde aynı sayı döndürülür. X64 için, Görev Yöneticisi'nde görüntülenen "Limit" değerine daha çok benzemelidir. Tüm durumlarda aşıldığında OutOfMemory-istisnalara neden olacak doğru sayıyı nasıl alabilirim? Maksimum Bellek a .NET işlemi

yöntem dönmelidir neyi Bazı örneklerde

:

1) Makine Yapılandırma: x64, Windows, 4GB fiziksel bellek, 4GB sayfa dosyası
-As 64-Bit süreci: 8GB
-As 32-Bit süreci : 1.4GB

2) Makine Yapılandırma: x64, Windows, 1GB fiziksel bellek, 2 GB sayfa dosyası
-As 64-Bit süreci: 3 GB
-As 32-Bit süreci: 1.4GB

3) Makine Yapılandırma: x32 Windows, 4GB fiziksel bellek, 4GB sayfa dosyası
-As 64-Bit süreci:
-As 32-Bit sürecini Olmayacak: 1.4GB

4) Makine Yapılandırma: x32 Windows, 512MB fiziksel bellek, 512MB sayfa dosyası
-As 64-Bit süreci: 1.0 GB

+0

Burada, .NET işleminin bellek istisnalarını görmeye başlayacağı teorik maksimumlar ve aralıklar hakkında konuşulan ilginç bir yazı var: http://blogs.msdn.com/b/ tom/arşivi/2008/04/10/sohbet-soru-bellek-limitleri-için-32-bit ve 64-bit-process.aspx –

cevap

3

Eğer varsa ne kadar RAM bağlı değildir:
-As 32-Bit sürecini olmayacak ? Teorik olarak, bir x64 işlemi EB'nin (etabytes?) RAM'sini ayırabilir, bence - bir LOT. Fakat eğer yaparsanız, makineniz çılgın gibi çağrı yapmaya başlamalı ve genellikle ölmeli.

Windows'ta HERHANGİ BİR işlemde 1 GB'den fazla RAM ayıramayacağınız için 32 bitlik modda farklıydı (evet, bunun etrafında yollar var, ancak bu hoş değil). Pratikte, .NET gibi bir alan ayırdıkça, bu .NET işlemi için 7-800meg civarındadır.

Her iki durumda da 32 bit, en çok 3 GB kullanabilirsiniz - OS, kendisi için 1 GB'lik bir sanal alan ayırır.

64 bit'te, büyük bir sayı olan 2^64 olmalıdır, ancak http://en.wikipedia.org/wiki/X86-64, 256 TB sanal uzay ve 1 TB GERÇEK RAM olduğunu belirtir. Her iki durumda da, makinenizde olması muhtemel olandan çok daha fazladır, bu yüzden sayfa dosyasına gidecektir. 64-bit işletim sistemi ve 64-bit çalışma zamanı ile

, NET 2.0 tabanlı uygulamaları şimdi böyle sunucu tabanlı önbelleklerine gibi veriler için 500 kat daha fazla bellek kullanabilir.

Eğer AnyCPU ve x 64 derleme, bir x 64 makine (yani x64 makinesi + x64 OS) üzerinde ise bu, BTW çok bazı iyi bilgi, http://www.theserverside.net/tt/articles/showarticle.tss?id=NET2BMNov64Bit

sahiptir yapar aynı şey - bu çalışır x64 modu.

  • x64 OS/.NET, AnyCpu: x64 uygulaması
  • x64 OS/sen AnyCPU vrs x86 kullanıyorsanız tek farktır.NET, x64: x64 uygulaması
  • x64 OS/.NET, x32: x32 uygulaması (Fx İKİ x32 ve x64 sürümleri yüklü olarak x64 NET framework)

  • x32 OS/NET, AnyCPU: x32 uygulaması

  • x32 OS/.NET, x64: CRASH VE YANIK BEBEK! (aslında, sadece incelikle ölür)
  • x32 OS/.NET, x32: x32 uygulaması.
+0

Ama bir makine için gerçek bellek sınırını nasıl alabilirim? – Rauhotz

+0

Cevabınızı kötü olarak işaretliyorum çünkü her şeyi karıştırdınız. 3 gig hafızası, 1 veya daha fazla işlem yaşayabilecek maksimum serbest fiziksel hafızadır. Herhangi bir işlem tam 4 konser alanına erişebilir (32 bit adres), fiziksel bellekte bulunamayan bellek önbelleğe alınacaktır (önbellek düzgün şekilde ayarlanmışsa). Ve 3 konser de tamamen doğru değil. XP'yi ayarlamalısınız, varsayılan olarak uygulama için maksimum 2 konser ve os (fiziksel bellek) için 2 konser vardır. –

+2

Üzgünüm, Eric, ama üzerinde okumaya ihtiyacın var. 32bit sistemdeki teorik sınır 4GB olabilir, ancak pencereler sizi 3 GB ile sınırlandırır (diğer GB sistem için kullanılır ve hatta bunu elde etmek için/3GB'ları boot paramlarında kullanmanız gerekir) ve her işlem bir 4GB alan, pencereler veya .NET FX, özel şeyler yapmayan işlemler için bir SQL sınırını zorlar (SQL ve Exchange). –

17

Windows, istek üzerine daha fazla sayfa alanı veya on request için ayrılmış olarak yapılandırılabilir.
Job objects, belirli bir miktardaki belleğin tüketimini engelleyebilir. yığın ve bunun nesiller doğası (artı Büyük Nesne içinde öbek büyük şeyler koymak gerek)

ait
Parçalanma Tüm bu sert sınır gerçekte çok kullanım değildir ve soruya cevap gelir anlamına "nasıl fazla bellek teorik olarak tahsis edebilir "düşündüğünüzden çok daha karmaşıktır.

o soru Muhtemelen bir şey yanlış yapmaya çalışıyor ve daha kullanışlı bir şey onların soru yönlendirmesi gerekir soran karmaşık kimse olduğundan.

Ne yapmaya çalışıyorsun böyle bir soru gerektiriyor gibi görünüyor?

"Ben sadece sürecinin mevcut bellek yükü yüzden özel bir önbellek bazı öğeleri özgür bırakmak gibi işlemleri gerçekleştirebilirsiniz sorunlu alabilir bilmek istiyorum."

Sağ. Bu bir soru daha çekilebilir. karmaşıklık düzeyine göre

İki çözümleri:

  1. sizin önbelleğe Bu işler sizin için neredeyse sihirli sistemi tarafından serbest olacağı anlamına gelir WeakReferences
    • kullanmaya dikkat edin ama gibi şeyler üzerinde çok az kontrole sahip olacak yedek politikası
    • bu anahtar ve zayıf referans yükü çok daha büyük olma önbelleğe verilerine dayalı
  2. Kayıt için notification of Garbage Collections
    • Bu, boş alanların kontrolünü ele almanızı sağlar.
    • GC nesiller için uygun maksimum boyuta sahip sisteme güveniyorsunuz, bu da sabit bir duruma ulaşmak için biraz zaman alabilir.

Dikkat edilmesi gereken noktaları. Bu masif önbelleği (seslere göre diske gidiyor) veriyi yeniden hesaplamak/yeniden istemek yerine gerçekten daha ucuzdur.
Önbelleğiniz, sıkça/art arda talep edilen öğeler arasında zayıf bir yerellik gösterirse, o zaman çok fazla çaba harmanlama verilerini içeri ve dışarı harcayacaktır. Etkili ayarlanmış bir para yatırımı ilkesiyle daha küçük bir önbellek, önemli ölçüde daha iyi performans gösterme şansına sahiptir (ve diğer çalışan programlarda çok daha az etki)

Bir kenara göre: In. Net, değişken boyutlu bir nesne (dizeler, diziler) Bellek yönetimi için çekirdek CLR yapılarının kısıtlamaları nedeniyle 2GB'den fazla boyutta olmalıdır. (ve yukarıdaki çözümden de faydalanacaksınız)

+0

Sadece işlemin şu anki bellek yükünün sorunlu olabileceğini bilmek istiyorum, bu yüzden bazı özel önbellek öğelerini serbest bırakmak gibi işlemler yapabilirim. Değerin% 100 doğru olması gerekmiyor, önbellek için sadece bir ipucu. Şu anda bir limit olarak serbest fiziksel bellek miktarım var, ama 32-bit süreçler için bariyer daha düşük. – Rauhotz

+0

BTW: Dinamik sayfa dosya boyutuna sahip iyi bir nokta, bunu kaçırdı, ancak şimdilik, şimdiki sınırdan memnun olacağım. – Rauhotz

+0

Aha - şimdi bir yere gidiyoruz - şimdi düzenleme cevabını – ShuggyCoUk

İlgili konular