2009-10-26 11 views
5
  1. Jakie są możliwe powody wyjątku od OutofMemory.Wyjątek OutOfMemory

  2. Alokacja pamięci powinna być obsługiwana przez GC.

  3. Ile pamięci jest przydzielana/Dostępne zastosowaniu normalnej .NET/C#

W naszej aplikacji chodzi w różnych miejscach, takich jak Stream.ReadToEnd() i DataTable.WriteXml(Memory stream) funkcji.

Środowisko jest .Net C#

+1

Po pierwsze, wspomnij przynajmniej o środowisku (o ile jest) na twoje pytanie. Przynajmniej .Net i Java mają wyjątek OOM. Po drugie, 2) nie jest to nawet właściwe pytanie. O co pytasz? Głosowanie w celu zamknięcia. – sleske

+0

1) Zasobnik jest .Net C# 2) dlaczego te pytania nie są właściwe – Buzz

+0

Cóż, pytanie 1) pytanie, ale tak ogólne, że tak naprawdę nie ma sensownej odpowiedzi. 2) nie jest pytaniem, a 3) powinno przynajmniej uzyskać znak zapytania. Spróbuj użyć poprawnej interpunkcji i pisowni, a co najważniejsze i podaj kontekst. – sleske

Odpowiedz

7

OutOfMemory exception się dzieje, gdy wezwanie do jednego z następujących instrukcji MSIL nie

  1. newobj
  2. newarr
  3. pudełko

Zasadniczo operacja s, które przydzielają nową pamięć w stercie, w twoim przypadku Stream.ReadToEnd najwidoczniej alokuje tablicę bajtów wewnętrznie, aby załadować strumień do pamięci, więc jeśli plik na tyle duży, aby przerwać proces, wyrzuci ten wyjątek.

1
  1. Powiedzmy, że masz maksymalnie 10 MB pamięci do użycia w swojej aplikacji. Tworzysz nową listę i dodajesz do niej instancje obiektów. Powiedzmy teraz, że każda instancja obiektu "waży" 1 MB. Tak więc pierwsze 10 wystąpień zostanie dodanych bez problemów, ale 11-ta instancja rzuci wyjątek OutOfMemoryException, ponieważ po pierwszych 10 wystąpieniach wykorzystano całą przydzieloną pamięć (10 MB).

  2. Śmieciarz szuka "Śmieci", Instancji, które nie będą używane - Które CANT może być użyte, ponieważ żadne inne przykłady go nie wskazują. W przypadku, gdy na przykład członek instancji ma typ Lista zawierająca instancje, GC nie będzie zbierać listy ani jej instancji. Kontynuuj dodawanie wystąpień do listy może i wzrośnie z wyjątkiem OutOfMEmory.

Użyj następujących argumentów vm jeśli chcesz/potrzebę zwiększenia pamięci wykorzystywanej przez aplikację Java: youAppName -Xms128m -Xmx512m

2

Albo używasz więcej pamięci niż aplikacja ma dostęp do niego . W takim przypadku musisz dowiedzieć się, jak zwiększyć efektywność wykorzystania pamięci. Korzystanie z plików/bazy danych do przechowywania danych, których nie używasz od razu, może być konieczne.

Albo, masz wyciek pamięci. W takim przypadku musisz spojrzeć na usuwanie odniesień do pamięci, kiedy już ich nie używasz, aby GC mógł zwolnić pamięć.

Jeśli używasz C# lub .Net możesz użyć Profilu CLR do analizy pamięci, aby zobaczyć, jak jest używana. CLR Profiler

+0

ile pamięci jest dostępne dla aplikacji, jak mogę to sprawdzić? – Buzz

+0

W 32-bitowym systemie Windows (pre-Win7) w pamięci wirtualnej istnieje twardy limit 2 GB (3 GB za pomocą określonego przełącznika). 64-bitowy system Windows może obsługiwać 8 TB (7 TB w Itanic). Rzeczywista pamięć, do której można uzyskać dostęp przed niepowodzeniem przydziału, może się różnić. –

2

Albo aplikacja zużyła dostępną pamięć lub masz problem z fragmentacją sterty.

W pierwszym przypadku utworzyłeś wystarczającą ilość obiektów, aby zająć całą pamięć i nadal masz do nich odniesienie, aby garbage collector nie mógł ich wyczyścić.

W drugim przypadku, fragmentacja sterty, próbujesz utworzyć obiekt, który jest większy niż największy ciągły kawałek pamięci w stercie. Jest to rzadsze, ale na pewno zdarza się to w niektórych przypadkach. Normalna sterty zostanie skompaktowana podczas przebiegu w gc, ale duża sterta obiektu nie będzie.

Na stronie MSDN znajduje się dobry article dotyczący sterty dużych obiektów.

Edycja: Zapamiętałem inny sposób na wydostanie się z pamięci. Możesz spróbować utworzyć obiekt większy niż 2 GB. To jest maksymalny rozmiar obiektu w .NET, nawet w wersji 64-bitowej.

Powiązane problemy