2009-06-11 9 views
9

Ho letto (http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx) che la dimensione massima di un oggetto in .NET è 2 GB.Memoria massima NET Utilizzare 2 GB anche per x64 Assiemi

Sono corretto nel presupporre che se ho un oggetto che occupa 256 MB di memoria, dal momento che è un tipo di riferimento, posso avere una matrice di questi oggetti da 256 MB in cui tutti gli oggetti insieme possono assorbire> 2 GB di memoria come finché la dimensione dell'array di riferimento rimane inferiore a 2 GB?

+0

Domanda interessante. Non sapevo che ci sarebbe stato questo limite su una macchina a 64 bit. Detto questo, non posso pensare a molti scenari per un'app che contiene 2 GB in un oggetto! – RichardOD

+0

Sono d'accordo, non ci sono molti scenari in cui avresti bisogno di più di 2 GB in un singolo oggetto. Un server di gioco o un server di database è davvero l'unica cosa che viene in mente. – Nate

risposta

10

Sì, la tua ipotesi è corretta.

Il limite di 2 GB si applica a ciascun oggetto singolarmente. La memoria totale utilizzata per tutti gli oggetti può superare 2 GB.

(Se il runtime è in grado di allocare memoria sufficiente per le proprie esigenze è un'altra questione. Dubito che potrebbe trovare un 2GB di memoria di riserva su una macchina a 32 bit, ma non dovrebbe essere un problema su 64 bit.)

+0

Quindi la "matrice di riferimento" sarà un oggetto che (in genere) occuperebbe la stessa quantità di spazio di un "array intero"? – Nate

+1

Nate> è un dettaglio di implementazione ma i riferimenti sono attualmente puntatori e quindi hanno le stesse dimensioni della dimensione del puntatore (in C era uguale a sizeof (int) sulla maggior parte dei sistemi ma in C# int significa sempre Int32) –

+0

è bizzarro considerando che la classe Array di .NET ha metodi speciali che accettano argomenti di lunghezza "lunga" dell'array. Se il limite è 2 GB, è impossibile che una lunghezza dell'array superi un int di 32 bit. – Qwertie

6

"In .NET 4 e precedenti, nessun oggetto può essere più grande di 2 GB, anche nei processi a 64 bit. Per determinati carichi di lavoro che utilizzano array di grandi dimensioni, tuttavia, questo limite di dimensioni può essere limitato. NET 4.5 supporta il limite massimo per gli array nei processi a 64 bit, in modo che gli array possano essere maggiori di 2 GB. Ciò significa, ad esempio, che è possibile allocare un array di Int32.MaxValue Int32s, anche se tale array consumerà 8 GB. Gli oggetti di grandi dimensioni in .NET sono allocati su un heap speciale, noto non a caso come Large Object Heap (LOH), .NET 4.5 ha anche visto miglioramenti significativi delle prestazioni del LOH, incluso l'utilizzo di algoritmi migliori per la gestione della memoria libera nell'heap ".

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