Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 24448|Odpowiedź: 0

[Źródło] . Przepełnienie pamięci sieciowej (System.OutOfMemoryException).

[Skopiuj link]
Opublikowano 14.03.2019 21:47:39 | | | |
Kiedy pojawia się OutOfMemonryException? Jeśli spróbujemy utworzyć nowy obiekt, a garbage collector nie znajdzie żadnej wolnej pamięci, możemy wychwycić wyjątek; Innym przypadkiem jest sytuacja, gdy CLR potrzebuje pamięci, a system nie może jej zapewnić, wyjątek również zostanie wyrzucony. Ale na tym etapie nasza aplikacja nie jest w stanie wykryć tego błędu.

Analiza debugowania przepełnienia pamięci (OutOfMemoryException).

Przestrzeń adresowa 32-bitowego systemu operacyjnego to 4G, z czego 2G zajmuje system operacyjny, co oznacza, że pamięć pozostawiona dla procesu użytkownika to tylko 2G (co również odejmuje część miejsca zajmowanego przez obraz podczas ładowania programu; zazwyczaj można użyć tylko około 1,6G~1,8G). Jeśli proces musi zażądać pamięci podczas działania, a system operacyjny nie może mu przydzielić przestrzeni pamięciowej, wygeneruje wyjątek poza pamięcią, System.OutOfMemoryException w .net (wyjątek, który jest wyrzucany, gdy nie ma wystarczającej ilości pamięci do kontynuowania wykonywania programu). Chociaż ostateczną manifestacją jest OutOfMemoryException, przyczyna może być inna, a przed rozwiązaniem tego problemu konieczne jest przeanalizowanie aktualnego stanu zużycia pamięci, aby znaleźć właściwą przyczynę przed przepisaniem odpowiedniego leku. Oto kilka wskazówek, jak rozwiązywać takie problemy.

Więcej informacji można znaleźć w:http://blog.csdn.net/lazyleland/article/details/6704661

iis Application Pool Memory Overflow Error System.OutOfMemoryException

Na serwerze ASP.NET ilość pamięci, którą ASP.NET może wykorzystać, zwykle nie jest równa całej ilości pamięci. W pliku konfiguracyjnym machine.config <processModel>znajduje się właściwość "memoryLimit" w sekcji konfiguracji, wartość tej właściwości to wartość procentowa, domyślna to "60", czyli proces ASP.NET (możesz zobaczyć ASP.NET proces w menedżerze zadań, aspnet_wp w IIS5, w3wp w IIS6) może wykorzystać 60% całej pamięci fizycznej. Gdy ilość zużytej pamięci przez ASP.NET przekroczy ten limit, IIS rozpocznie automatyczne powtarzanie procesu, czyli utworzenie nowego procesu do obsługi żądań Http i odzyskanie pamięci zajmowanej przez stary proces.

Gdy mamy serwer z dużą pamięcią, wartość "memoryLimit" musi być odpowiednio dostosowana. Na przykład, jeśli przygotujemy serwer z chemas-microsoft-com ffice marttags" />t="on"> pamięci 4G, to t="on">4G×60%=t="on">2.4G. Jednak dla systemów operacyjnych Win32 cała przestrzeń pamięci, którą może zajmować proces, to tylko t="on">2G. Gdy pamięć zajmowana przez proces ASP.NET zaczyna osiągać t="on">2G, ponieważ nie osiąga "progu recyklingu" t="on">2.4G, IIS nie rozpocznie operacji recyklingu, ale ze względu na ograniczenia Win32 faktycznie niemożliwe jest przydzielenie większej ilości pamięci temu procesowi, dlatego prawdopodobnie zostanie wyrzucony OutOfMemoryException. Aby tego uniknąć, musieliśmy odpowiednio zmniejszyć "memoryLimit", aby IIS mógł przetwarzać recykling wcześniej.

Microsoft zaleca, aby ASP.NET proces zajmował nie więcej niż 60% pamięci, a najlepiej było, aby obliczona rzeczywista wartość nie przekraczała t="on">800M. Mimo to, dla serwera z t="on" > pamięcią 4G najlepiej ustawić właściwość "memoryLimit" na "20". Ustalenie odpowiedniego progu recyklingu, aby IIS mógł przetwarzać procesy w odpowiednim czasie, jest bardzo ważne, aby zapewnić stabilne działanie całego serwera i uniknąć OutOfMemoryException.

W IIS6 próg recyklingu dla ASP.NET procesów nie jest już określany przez właściwość "memoryLimit" w sekcji konfiguracji, lecz przez ustawienia w konfiguracji puli aplikacji w Menedżerze IIS.

Jednak nawet jeśli te konfiguracje zostaną poprawnie ustawione, nie ma gwarancji, że OutOfMemoryExceptions zostaną całkowicie uniknięte, a powody mogą być różnorodne i złożone, na przykład operacje odzyskiwania pamięci mogą być zbyt czasochłonne. Deweloperzy powinni zawsze pamiętać, by nie używać i nie marnować pamięci niepotrzebnie w swoim kodzie. :)

Jeśli masz serwer z dużą pamięcią i frustruje Cię ograniczenie korzystania z pamięci t="on" >2G w systemie Win32, istnieją dwa alternatywne rozwiązania:

  • Uruchom komputer w trybie /3GB i kliknij link po artykule o udziale metodycznym
  • Użyj Windows Server 2003 64bits Edition


Kilka elementów mających na celu uniknięcie przepełnienia pamięci

Jeśli chcesz stworzyć tablicę, upewnij się, że ma odpowiedni rozmiar.

Upewnij się, że masz wystarczająco dużo pamięci do użytku wewnętrznego i nowych obiektów hostowanych.

Jeśli programujesz w .NET Compact Framework, środowisko uruchomienia języka publicznego wyrzuca ten wyjątek, gdy nie ma wystarczającej ilości pamięci do użytku wewnętrznego lub nowego obiektu zarządzanego. Aby uniknąć tego wyjątku, należy unikać pisania dużych metod zajmujących 64KB lub więcej pamięci.

Nadmierne zużycie zarządzanej pamięci często jest spowodowane przez:

  • Czytaj duże zbiory danych do pamięci.
  • Tworzenie zbyt wielu wpisów w pamięci podręcznej.
  • Przesyłaj lub pobieraj duże pliki.
  • Używaj zbyt wielu wyrażeń regularnych lub ciągów znaków podczas analizy plików.
  • Nadmierny status oglądalności.
  • W stanie sesji jest za dużo danych lub za dużo sesji.
  • Ten wyjątek może być wywołany, gdy metoda zostanie wywołana na obiekcie COM, a metoda zwraca typ zdefiniowany przez użytkownika, zawierający bezpieczną tablicę (tablicę o nieograniczonych rozmiarach) z dodatkowym komunikatem "Za mało miejsca na przechowywanie tej operacji". Wynika to z faktu, że .NET Framework nie potrafi mapować pól strukturalnych za pomocą bezpiecznych typów tablic.


Przykład przekroczenia pamięci spowodowanego nieprawidłowym użyciem tablic bajtów


Jeśli plik wyjściowy jest szczególnie duży, może bezpośrednio raportować System.OutOfMemoryException. Poprawnym sposobem jest wygenerowanie strumienia bajtów pliku w segmentach, ale asp.net istnieje gotowa metoda Response.WriteFile(filePath), która właśnie to robi.

Oto poprawny sposób pisania:

Gdy asp.net doświadcza przepełnienia pamięci, łatwym sposobem jest natychmiastowe odzyskanie puli aplikacji. Ale to nie rozwiązało całkowicie problemu.

Przepełnienie pamięci podczas tworzenia typu obrazu (System.OutOfMemoryException)

Kod błędu: System.Drawing.Image myimg=System.Drawing.Image.FromFile(plik. FullName);

Wyjątki, które są wyrzucane, gdy otwarty plik nie jest plikiem obrazu:



MSDN: Ta metoda wyrzuca wyjątek OutOfMemoryException, jeśli plik nie ma prawidłowego formatu obrazu lub GDI+ nie obsługuje formatu pikseli pliku.

Takie nieprawidłowe informacje łatwo wprowadzają w błąd.

<processModel> Element

Konfiguruj ustawienia modelu procesu ASP.NET na serwerze internetowym Internet Information Services (IIS). Sekcję można ustawić tylko w pliku Machine.config <processModel> i wpływa na wszystkie ASP.NET aplikacje działające na serwerze.

Ostrzeżenie: Aby uzyskać informacje na temat tego elementu, prosimy o zapoznanie się z sekcją "Notatki".

Przykład konfiguracji struktury:

egzegeza

System konfiguracji zarządzanego kodu nie odczytuje <processModel> ustawień konfiguracji. Zamiast tego jest odczytywany bezpośrednio przez niezarządzane aspnet_isapi.dll DLL. Zmiany w tej sekcji wchodzą w życie po ponownym uruchomieniu IIS.

Jeśli instalujesz ASP.NET na kontrolerze domeny, musisz podjąć specjalne kroki, inaczej instalacja nie zadziała. Więcej informacji można znaleźć w Located inhttp://support.microsoft.comArtykuł Microsoftu w Knowledge Base CHS315158 "ASP.NET nie mogą używać domyślnego konta ASPNET na kontrolerach domeny".

Gdy ASP.NET działa w trybie natywnym IIS wersji 6, używa modelu procesu IIS 6 i ignoruje <processModel> ustawienia w tej sekcji. Aby skonfigurować tożsamość procesu, recykling lub inne wartości modelu procesu, użyj interfejsu użytkownika Internet Services Manager, aby skonfigurować procesy robocze IIS dla swojej aplikacji.

Wartość czasu jest sformatowana jako "hours:minutes:seconds". Jeśli podana jest tylko jedna liczba bez dwukropka, przyjmuje się, że wartość to minuty; Dlatego timeout="4" odpowiada timeoutowi="00:04:00".

Jeśli aplikacja ASP.NET powoduje ponowne uruchomienie procesów roboczych ASP.NET (Aspnet_wp.exe na Windows 2000 i Windows XP Professional oraz W3wp.exe na Windows Server 2003) i pojawi się komunikat o błędzie wskazującym, że restart jest spowodowany podejrzeniem zakleszczenia o zablokowanie, powinno się zwiększyć ustawienie responseDeadlockInterval.

Przechowuj nazwy użytkowników i hasła w rejestrze

Przechowuj nazwy użytkowników i hasła w rejestrze

Aby zaszyfrować nazwy użytkownika i hasła oraz przechowywać je w rejestrze, ustaw nazwę użytkownika i hasło w następujący sposób.

userName="registry:HKLM\Software\AspNetProcess,Name"

password="registry:HKLM\Software\AspNetProcess,Pwd"

Część ciągu znaków znajdująca się po rejestrze słów kluczowych i przed przecinkiem wskazuje nazwę klucza rejestru, który ASP.NET otwiera. Część po przecinku zawiera nazwę wartości ciągu łańcuchowego, z której ASP.NET odczytuje poświadczenia. Wymagane są przecinki, a poświadczenia muszą być przechowywane w jednostce konfiguracyjnej HKLM. Jeśli konfiguracja zostanie źle sformatowana, ASP.NET nie uruchomi procesu roboczego i pojawi się następnie na ścieżce kodu awarii przy tworzeniu bieżącego konta.

Poświadczenia muszą być w REG_BINARY formacie i zawierać wyjście wywołania do funkcji Windows API CryptProtectData. Możesz tworzyć i przechowywać poświadczenia szyfrowania w rejestrze za pomocą aplikacji ASP.NET Settings Registry Console (Aspnet_setreg.exe), która korzysta z CryptProtectData do zakończenia szyfrowania. Aby pobrać kod źródłowy Aspnet_setreg.exe i Visual C++ oraz uzyskać pomoc, odwiedź stronę internetowąwww.asp.neti wyszukaj "aspnet_setreg".

Powinieneś skonfigurować dostęp do kluczy rejestru, które przechowują zaszyfrowane poświadczenia, tak aby dostęp był dostępny tylko dla administratorów i SYSTEM. Ponieważ klucz rejestru zostanie odczytany przez proces ASP.NET działający jako SYSTEM, powinieneś ustawić następujące uprawnienia:

Administrators:F

SYSTEM:F

WŁAŚCICIEL TWÓRCY: F

ProcessAccount:R

Zapewni to dwie linie obrony chroniące dane:

Uprawnienia ACL wymagają dostępu do danych z tożsamością administratora.
Atakujący musiałby uruchomić kod (CryptUnprotectData) na serwerze, aby odzyskać dane uwierzytelniające konta.

przykład

Poniższy przykład określa kilka <processModel> ustawień konfiguracji.

Poniższy przykład określa, że zaszyfrowana nazwa użytkownika i hasło są przechowywane pod elementem zdefiniowanym przez użytkownika rejestru AspNetProcess.

Wymagania

  • Uwzględnione w: <system.web>
  • Platforma internetowa: IIS 5.0, IIS 5.1, IIS 6.0
  • Pliki konfiguracyjne: Machine.config, Web.config
  • Handler sekcji konfiguracyjnej: System.Web.Configuration.ProcessModelConfigurationHandler


http://doc.51windows.net/iismmc/ ... essmodelelement.htm





Poprzedni:C# określa, czy przesłany plik jest obrazem i zapobiega przesyłaniu konia trojańskiego
Następny:Dzielenie się kolekcją ebooków w języku C
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com