|
|
Yayınlandı 14.03.2019 21:47:39
|
|
|
|

OutOfMemonryException ne zaman gerçekleşir? Yeni bir nesne oluşturmaya çalışırsak ve çöp toplayıcı boş bir bellek bulamazsa, istisna olabiliriz; Bir diğer örnek ise, CLR belleğe ihtiyaç duyduğunda ve sistem bunu sağlayamadığında, istisna da atılır. Ama şu anda başvurumuz hatayı yakalayamıyor.
Bellek taşmasının hata analizi (OutOfMemoryException).
32-bit işletim sisteminin adresleme alanı 4G'dir ve bunun 2G'si işletim sistemi tarafından işgal edilir; bu da kullanıcı süreci için kalan belleğin sadece 2G olduğu anlamına gelir (bu da program yüklendiğinde görüntünün kapladığı alanın bir kısmını azaltır, genellikle sadece yaklaşık 1.6G~1.8G kullanılabilir). Bir süreç çalışırken bellek istemesi gerekiyorsa ve işletim sistemi ona bellek alanı ayıramıyorsa, .net içinde System.OutOfMemoryException adlı bir bellek dışı istisna oluşturur (Programın yürütülmesini sürdürmek için yeterli bellek olmadığında atılan istisna). Son tezahür OutOfMemoryException olsa da, neden farklı olabilir ve bu sorunu çözmeden önce, doğru ilacı yazmadan önce doğru nedeni bulmak için sürecin mevcut hafıza kullanım durumunu analiz etmek gerekir. İşte bu tür sorunları hata ayıklamak için bazı ipuçları.
Daha fazla bilgi için lütfen şu adrese bakınız:http://blog.csdn.net/lazyleland/article/details/6704661
iis Uygulama Havuzu Bellek Taşma Hata Sistemi.OutOfMemoryException
ASP.NET bir web sunucusunda ASP.NET kullanabileceği bellek genellikle tüm bellek miktarına eşit değildir. machine.config yapılandırma dosyasında, <processModel>yapılandırma bölümünde "memoryLimit" adlı bir özellik vardır, bu özelliğin değeri yüzde değeridir, varsayılan değer "60"dır, yani ASP.NET süreci (görev yöneticisinde ASP.NET sürecini görebilirsiniz, IIS5'te aspnet_wp w3wp IIS6'da) tüm fiziksel belleğin %60'ını kullanabilir. ASP.NET tarafından kullanılan bellek miktarı bu sınırı aştığında, IIS süreci otomatik olarak geri dönüştürmeye başlar; yani Http taleplerini işlemek için yeni bir süreç oluşturur ve eski sürecin işgal ettiği belleği geri alır.
Büyük bir belleğe sahip bir sunucumuz olduğunda, "memoryLimit" değerinin uygun şekilde ayarlanması gerekir. Örneğin, chemas-microsoft-com ffice marttags" />t="on" ile bir sunucu hazırlarsak> 4G bellek t="on">4G×60%=t="on">2.4G. Ancak Win32 işletim sistemleri için, bir sürecin kaplayabileceği tüm bellek alanı sadece t="on">2G'dir. ASP.NET sürecinin işgal ettiği bellek t="on">2G'ye ulaşmaya başladığında, çünkü t="on">2.4G "geri dönüşüm eşiğine" ulaşmadığında, IIS geri dönüşüm işlemi başlatmaz, ancak Win32'nin sınırlamaları nedeniyle bu sürece daha fazla bellek tahsis etmek imkansızdır, bu yüzden OutOfMemoryException muhtemelen atılır. Bunu önlemek için, IIS'nin geri dönüşümü daha erken işleyebilmesi için "memoryLimit"i uygun şekilde azaltmamız gerekiyordu.
Microsoft, ASP.NET sürecin belleğin %60'ından fazlasını kaplamamasını önerir ve hesaplanan gerçek değerin t="on">800M'den fazla olmaması en iyisidir. Bununla birlikte, t="açık" > 4G belleğe sahip bir sunucu için "memoryLimit" özelliğini "20" olarak ayarlamak en iyisidir. IIS'nin süreçleri zamanında geri dönüştürmesi için uygun bir geri dönüşüm eşiği belirlemek, tüm sunucunun istikrarlı çalışmasını sağlamak ve OutOfMemoryException'ı önlemek için çok önemlidir.
IIS6'da, ASP.NET süreçler için geri dönüşüm eşiği artık yapılandırma bölümündeki "memoryLimit" özelliğiyle değil, IIS Manager'daki uygulama havuzu yapılandırmasındaki ayarlarla belirlenir.
Ancak, bu yapılandırmalar doğru ayarlansa bile, OutOfMemoryExceptions'ın tamamen önleneceği garantisi yoktur ve nedenler çeşitli ve karmaşık olabilir; örneğin bellek geri kazanma işlemleri çok zaman alıcı olabilir. Geliştiriciler, kodlarında gereksiz yere bellek kullanmamaları ve israf etmemeleri gerektiğini her zaman unutmamalıdır. :)
Büyük bir belleğe sahip bir sunucunuz varsa ve Win32 işletim sisteminde t="açık" >2G bellek kullanma sınırından dolayı hayal kırıklığına uğrayıyorsanız, iki alternatif çözüm vardır:
- Bilgisayarı /3GB modunda başlatın ve yöntem katılım makalesinden sonraki bağlantıyı takip edin
- Windows Server 2003 64bits Edition kullanın
Bellek taşmasını önlemek için birkaç unsur
Bir dizi oluşturmak istiyorsanız, doğru boyutta olduğundan emin olun.
İç kullanım ve yeni hosted nesneler için yeterli belleğe sahip olduğundan emin olun.
.NET Compact Framework ile programlıyorsanız, public language çalışma zamanı dahili kullanım veya yeni yönetilen nesne için yeterli bellek olmadığında bu istisna oluşturur. Bu istisnadan kaçınmak için, 64KB veya daha fazla bellek kaplayan büyük metodlar yazmaktan kaçınmalısınız.
Aşırı yönetilen bellek kullanımı genellikle şu nedenlerden kaynaklanır:
- Büyük veri setlerini hafızaya oku.
- Çok fazla önbellekli giriş oluşturmak.
- Büyük dosyaları yükleyin veya indirin.
- Dosyaları analiz ederken çok fazla düzenli ifade veya dizgi kullanın.
- Aşırı görüntüleme durumu.
- Oturum durumunda çok fazla veri veya çok fazla oturum var.
- Bu istisna, bir metot COM nesnesinde çağrıldığında ve yöntem, "Bu işlemi tamamlamak için yeterli depolama alanı yok" mesajıyla güvenli bir dizi (belirsiz boyutta bir dizi) içeren kullanıcı tanımlı bir tür döndürdüğünde ortaya çıkabilir. Bunun nedeni, .NET Framework'ün güvenli dizi tipleriyle yapısal alanları yönetememesidir.
Bayt dizilerinin yanlış kullanımı nedeniyle oluşan bir bellek aşımı örneği
Çıktı dosyası özellikle büyükse, doğrudan System.OutOfMemoryException raporunu verebilir. Bunu yapmanın doğru yolu dosyanın bayt akışını segmentler halinde çıkarmaktır, ancak bunu yapan hazır asp.net yöntem olan Response.WriteFile(filePath) vardır.
Doğru yazma şekli şöyledir:
Bir asp.net bellek taşması yaşadığında, bununla başa çıkmanın kolay yolu uygulama havuzunu hemen geri kazanmaktır. Ama bu sorunu tamamen çözmedi.
Bir Görüntü türü oluşturulduğunda bellek taşması (System.OutOfMemoryException)
Hata kodu: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file. FullName);
Açık bir dosya bir görüntü dosyası olmadığında atılan istisnalar:
MSDN: Bu yöntem, dosyanın geçerli bir görüntü formatı yoksa veya GDI+ dosyanın piksel formatını desteklemiyorsa OutOfMemoryException istisnası oluşturur.
Böyle anormal bilgiler kolayca yanıltıcıdır.
<processModel> element
Internet Information Services (IIS) web sunucusunda ASP.NET süreç modeli ayarlarını yapılandırın. Bu bölüm yalnızca Machine.config dosyasında <processModel> ayarlanabilir ve sunucuda çalışan tüm ASP.NET uygulamaları etkiler.
Uyarı Bu unsur hakkında bilgi için lütfen "Notlar" bölümünü okuyun.
Yapının yapılandırılmasına örnek:
tefsir
Yönetilen kod yapılandırma sistemi <processModel> yapılandırma ayarlarını okumaz. Bunun yerine, doğrudan yönetilmeyen DLL aspnet_isapi.dll tarafından okunur. Bu bölümdeki değişiklikler, IIS'i yeniden başlattıktan sonra geçerli olur.
ASP.NET bir alan kontrolcüsüne kurarsanız, özel adımlar atmanız gerekir, yoksa kurulum çalışmaz. Daha fazla bilgi için bkz. Konumuhttp://support.microsoft.comMicrosoft makalesi Knowledge Base'CHS315158 de "ASP.NET alan kontrolörlerinde varsayılan ASPNET hesabını kullanamaz" diye belirtiliyor.
ASP.NET IIS sürüm 6 yerel modunda çalışırken, IIS 6 işlem modelini kullanır ve <processModel> bölümdeki ayarları görmezden gelir. Süreç kimliği, geri dönüşüm veya diğer süreç model değerlerini yapılandırmak için, uygulamanız için IIS işçi süreçlerini yapılandırmak üzere Internet Services Manager kullanıcı arayüzünü kullanın.
Zaman değeri "saat:dakika:saniye" olarak biçimlendirilir. Eğer sadece bir sayı iki nokta olmadan verilirse, değer dakika olarak kabul edilir; Bu nedenle, timeout="4" timeout="00:04:00" ile eşdeğerdir.
Bir ASP.NET uygulaması ASP.NET çalışan süreçlerinin (Windows 2000 ve Windows XP Professional Aspnet_wp.exe ve Windows Server 2003'te W3wp.exe) yeniden başlatılmasına neden olursa ve yeniden başlatmanın şüpheli bir çıkmaz durumundan kaynaklandığını belirten bir hata mesajı verirse, bu durum artmalıdır responseDeadlockInterval ayarı.
Kullanıcı adlarını ve şifreleri kayıt defterinde sakla
Kullanıcı adlarını ve şifreleri kayıt defterinde sakla
Kullanıcı adlarını ve şifreleri şifrelemek ve kayıt defterinde saklamak için kullanıcı adı ve şifreyi aşağıdaki şekilde ayarlayın.
userName="registry:HKLM\Software\AspNetProcess,Name"
password="registry:HKLM\Software\AspNetProcess,Pwd"
Anahtar kelime kaydından sonra ve virgülden önce gelen dizi, ASP.NET açılan kayıt anahtarının adını gösterir. Virgülden sonraki kısım, ASP.NET'nin kimlik bilgilerini okuyacağı bir dizi değer adı içerir. Virgüller gereklidir ve kimlik bilgileri HKLM yapılandırma ünitesinde saklanmalıdır. Yapılandırma yanlış biçimlendirilmişse, ASP.NET işçi sürecini başlatmaz ve ardından mevcut hesap oluşturma hata kodu yolunda görünür.
Kimlik bilgileri REG_BINARY formatta olmalı ve Windows API fonksiyonu CryptProtectData'ya yapılan çağrının çıktısını içermelidir. Şifreleme bilgilerini kayıt defterinde ASP.NET Settings Registry Console uygulaması (Aspnet_setreg.exe) ile oluşturabilir ve depolayabilirsiniz; bu uygulama, şifrelemeyi tamamlamak için CryptProtectData kullanır. Aspnet_setreg.exe ve Visual C++ kaynak kodunu indirmek ve yardım almak için web sitesini ziyaret edinwww.asp.netve "aspnet_setreg" arama.
Şifrelenmiş kimlik bilgilerini saklayan kayıt anahtarlarına erişimi yalnızca Yöneticiler ve SYSTEM'e erişim sağlayacak şekilde yapılandırmalısın. Kayıt anahtarı, SYSTEM olarak çalışan ASP.NET işlemi tarafından okunacağı için aşağıdaki izinleri ayarlamanız gerekir:
Administrators:F
SYSTEM:F
YARATICI SAHIP:F
ProcessAccount:R
Bu, verileri korumak için iki savunma hattı sağlayacaktır:
ACL izinleri, Yönetici kimliğiyle verilere erişim gerektirir. Saldırgan, hesabın kimlik bilgilerini geri kazanmak için sunucuda kod (CryptUnprotectData) çalıştırmak zorunda kalır.
örnek
Aşağıdaki örnek birkaç <processModel> yapılandırma ayarını belirtir.
Aşağıdaki örnek, şifrelenmiş kullanıcı adı ve şifrenin kayıt kullanıcı tanımlı öğesi AspNetProcess altında saklandığını belirtir.
Gereksinimler
- Dahil edilen: <system.web>
- Web platformu: IIS 5.0, IIS 5.1, IIS 6.0
- Yapılandırma dosyaları: Machine.config, Web.config
- Yapılandırma bölümü handler: System.Web.Configuration.ProcessModelConfigurationHandler
http://doc.51windows.net/iismmc/ ... essmodelelement.htm
|
Önceki:C#, yüklenen dosyanın bir görüntü olup olmadığını belirler ve Truva atı yüklemelerini engellerÖnümüzdeki:C dili e-kitap koleksiyonu paylaşımı
|