64-bit .NET Framework çalıştırılan yönetilen bir uygulamada özel bellek yetersiz

ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.

Makalenin İngilizcesi aşağıdaki gibidir: 3152158
Belirtiler
64 bit Microsoft .NET Framework 4.6.1 hedefleyen bir yönetilen uygulamayı var. Bu uygulama aşağıdaki belirli ileti CLR tarafından bir bellek yetersiz istisna atar:

OutOfMemoryException: "bellek yetersiz programın yürütülmesine devam etmek için belirtilen adres alanı aralığı içinde."
Neden
Bu bellek yetersiz özel kod Yöneticisi alt atlama Saplamaları için belirli bir adres alanı aralığı içinde bellek ayrılamıyor, CLR tarafından yayılır. (Bunlar Saplamaları atlama 2 GB veya daha fazla uzaklıkta adres alanında bulunan DLL'ler arasında çağıran yöntemine karşılık gelir.) 64-bit yöntem çağrısı için atlama saplama depolamak için arama yöntemi 2 GB Boyutunda bir yarıçap içinde boş alan olması gerekir. Bir uygulamanın belirli bu hatadan kurtarmak güvenli bir yolu yoktur. Bu nedenle, bu hata karşılaştıktan sonra uygulamanın durumu bilinmiyor ve dikkate alınması gereken bozuk. Kurtarmanın tek yolu, uygulamanın yeniden başlatmaktır.
Pratik Çözüm
Bu soruna geçici bir çözüm için ayarı aşağıdaki yöntemlerden birini kullanın:
  • Makineye özel ayarı aşağıdaki kayıt defteri anahtarı ve değeri ekleyerek uygular:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Uygulama düzeyi ayarı ekleyerek uygulamak (veya birleştirme) uygulama yapılandırma dosyanıza aşağıdaki bölümü:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Açıklama: NGenReserveForJumpStubs yüzde adres alanının yakınında yüklenen her NGen görüntü atlama Saplamaları için rezerve etmek CLR neden olur. Bu OutOfMemory özel durum yaşıyorsanız, 5 veya daha büyük bir değer kullanmanızı öneririz.
Daha fazla bilgi

Geliştiriciler için

  • .NET Framework yöntemi kodlar çağrısı olarak performansı artırmak için göreli 32-bit atlar. 64-bit bir sistemde, arayan ve Aranan daha uzak 2 GB'den (adres alanı) olabilir. Bu adres aralığı imzalı bir 32-bit uzaklık aştığı için .NET atlama saplama arayan 2 GB içinde oluşturur. Bu atlama saplama can sonra "uzun" herhangi bir 64-bit adres alanı atlamak yap.
  • JIT ve NGen Azaltıcı biraz farklı çalışır. İkisinin de en önde ek adres alanı ayırır ancak nerede bu rezervasyonu yapılır noktası ikisi arasında farklılık gösterir.
  • NGenReserveForJumpStubs bir sanal NGen görüntü boyutu (yüzdesidir.percentReserveForJumpStubs).
  • Tipik atlama saplama 12 bayttır. Daha fazla bilgi için bkz. JUMP_ALLOCATE_SIZE.
  • Bellek tahsis ve burada NGen görüntü yüklenen adresinin yakın ayrılmış (tam algoritma nedir EEJitManager::EnsureJumpStubReserve). Bellek tahsis atlama saplama gerek olduğunda ve kullanılabilir diğer uygun adres alanı olduğunda kararlıdır.
  • Yukarıda açıklanan Azaltıcı NGen görüntülerindeki içeriğini değiştirmek değildir. NGen görüntülerindeki aynı disk Ayak izi ile veya bunlar olmadan Azaltıcı etken vardır.
  • Şu anda uygulama sınırına yakın alırken algılamak için iyi bir yolu yoktur. OutOfMemoryException ayrılmış alan yeterli olup olmadığını belirlemek izlemeniz gerekir.
  • Olsa bile çok sayıda kullanılmayan bellek bellek 2 GB adres aralığı RADIUS arayanın içinde kullanılabilirliğini ilgili bu belirli hata nedeniyle OutOfMemoryException alabilirsiniz.
  • Bunun için yukarıda açıklanan sorunla ilişkili olmayabilir çünkü CodeHeapReserveForJumpStubs, varsayılan değerini değiştirmemeniz. Nerede bu ayarı geçici bir çözüm olarak gerçek uygulama gerekir çalışması görmediğiniz.
  • NGenReserveForJumpStubs önemli ölçüde daha yüksek bir değere ayarlamak, düşük performansı ve zarif başka sorunlar ortaya çıkarma riskini neden olabilir.

BT kullanıcılar için

  • Bu sorun, .NET Framework'ün diğer sürümlerinde de oluşabilir. Ancak, .NET Framework yalnızca 4.6.1 şu anda uygulanabilir çözüm olabilir.
  • Yalnızca çok titiz yürütme desen sahip çok büyük iş yüklerini etkiler çok nadiren görülen bir sorundur. Tüm iş yüklerinin yüzde 99'dan fazla şimdiye kadar bu sorunu karşılaşacaklardır.
  • Uygulamada aykırı OutOfMemory sonra kurtarmak için önerilen tek yolu, uygulama yeniden başlatmaktır.

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 3152158 - Son İnceleme: 05/10/2016 19:35:00 - Düzeltme: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMttr
Geri bildirim