2009-06-11 18 views
9

Przeczytałem (http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx), że maksymalny rozmiar obiektu w .NET wynosi 2 GB..NET Max Memory Użyj 2 GB nawet dla złożeń x64

Czy mam rację zakładając, że jeśli mam obiekt, który zajmuje 256 MB pamięci, ponieważ jest to typ odniesienia, mogę mieć tablicę tych 256 MB obiektów, gdzie wszystkie obiekty razem mogą zająć> 2 GB pamięci jako o ile rozmiar tablicy referencyjnej nie przekracza 2 GB?

+0

Ciekawe pytanie. Nie wiedziałem, że będzie taki limit na maszynie 64-bitowej. Powiedział, że nie mogę myśleć o wielu scenariuszach dla aplikacji, która ma 2 GB w jednym obiekcie! – RichardOD

+0

Zgadzam się, nie ma wielu scenariuszy, w których potrzebujesz więcej niż 2 GB w jednym obiekcie. Serwer gry lub serwer bazy danych to naprawdę jedyna rzecz, która przychodzi na myśl. – Nate

Odpowiedz

10

Tak, twoje założenie jest prawidłowe.

Limit 2 GB dotyczy każdego obiektu osobno. Całkowita pamięć używana dla wszystkich obiektów może przekraczać 2 GB.

(Inną kwestią jest to, czy środowisko wykonawcze jest w stanie przydzielić wystarczającą ilość pamięci do swoich wymagań, czy nie, może znaleźć pełne 2 GB wolnej pamięci na 32-bitowej maszynie, ale nie powinno to stanowić problemu na 64-bitach).

+0

Zatem "tablica referencyjna" będzie obiektem, który (zazwyczaj) zajmie tyle samo miejsca co "tablica liczb całkowitych"? – Nate

+1

Nate> jest to szczegół implementacji, ale odnośniki są obecnie wskaźnikami i dlatego mają taki sam rozmiar jak rozmiar wskaźnika (w C był taki sam jak sizeof (int) na większości systemów, ale w C# int zawsze oznacza Int32) –

+0

To jest dziwne, biorąc pod uwagę, że klasa .NET's Array ma specjalne metody, które pobierają "długie" argumenty o długości tablicy. Jeśli limit wynosi 2 GB, niemożliwe jest, aby długość tablicy przekroczyła 32-bitową wartość int. – Qwertie

6

"W .NET 4 i wcześniejszych, żaden obiekt nie może mieć rozmiaru większego niż 2 GB, nawet w procesach 64-bitowych. W przypadku niektórych obciążeń, które wykorzystują duże tablice, ograniczenie rozmiaru może być jednak ograniczone. NET 4.5 obsługuje podnoszenie limitu dla tablic w procesach 64-bitowych, tak, że tablice mogą być większe niż 2 GB. Oznacza to na przykład, że można przydzielić tablicę Int32.MaxValue Int32, mimo że taka tablica zużyje 8 GB. Duże obiekty w .NET są przydzielane na specjalnym stosie, znanym nieprzypadkowo jako stertka dużych obiektów (LOH); .NET 4.5 zaobserwował również znaczną poprawę wydajności LOH, w tym wykorzystanie lepszych algorytmów do zarządzania wolną pamięcią w stercie. "

http://msdn.microsoft.com/en-us/library/hh285054(v=VS.110).aspx

http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx

Powiązane problemy