2009-04-04 10 views
13

Qual è la quantità massima di memoria che è possibile ottenere nel codice gestito .NET? Dipende dall'architettura attuale (32/64 bit)?Memoria massima raggiungibile .NET?

+0

Sì, c'è .. Dare un colpo e guardare il runtime bomb out a circa 900MB su architetture a 32 bit .. O semplicemente esegui un set di dati decente, nemmeno di grandi dimensioni .. Triste davvero. –

+0

Altri fatti sarebbero belli. –

+0

Beh, se hai bisogno di un dato di fatto, è meglio caricarlo e cercare l'eccezione OutOfMemory quando lo raggiunge .. Il problema è che devi solo eseguire un paio di tali app (conosci la dimensione decente) e voilà: CLR sono teorici efficienti che si preoccupano per questo. –

risposta

2

Sì, in un ambiente a 32 bit ci si limita a uno spazio di indirizzo da 4 GB, ma Windows afferma circa la metà. Su un'architettura a 64 bit è, beh, molto più grande. Credo che sia 4G * 4G

E sul Compact Framework di solito è nell'ordine di qualche centinaio di MB

+2

Dire 4G * 4G può indurre la gente a pensare a 16G. In realtà, 4G è 2^32 byte, quindi circa 4 miliardi. e il limite di 64 bit è 2^64 = (2^32) * (2^32), che è (4 miliardi) * (4 miliardi) e questo è molto più di 16G. – Karl

11

Non ci sono duro, cifra esatta per il codice .NET.

Se si esegue su Windows a 32 bit; il vostro processo può indirizzare fino a 2 GB, 3 GB se l'opzione/3GB viene utilizzata in Windows Server 2003.

Se si esegue un processo a 64 bit su una scatola a 64 bit tua processo può indirizzare fino a 8 TB di spazio indirizzo, se è presente molta RAM.

Questa non è l'intera storia, tuttavia, dal momento che il CLR prende alcuni overhead per ogni processo. Allo stesso tempo, .NET tenterà di allocare nuova memoria in blocchi; e se lo spazio degli indirizzi è frammentato, ciò potrebbe significare che non è possibile allocare più memoria, anche se alcuni sono disponibili.

+0

Non è vero. Windows su x86 limita la dimensione della partizione in modalità utente a 8 TB (8192 GB). –

+1

"può indirizzare l'intero spazio di indirizzamento a 64 bit, se è presente molta RAM" non è corretto e deve essere modificato .. –

+1

Processo a 32 bit a 64 bit Windows può accedere a 4 GB di spazio utente (con un grande avviso di indirizzo ... stesso criterio per accedere a 3 GB sotto/3 GB). – Richard

7

In C# 2.0 e 3.0 esiste anche un limite di 2G sulle dimensioni di un singolo oggetto nel codice gestito.

0

Penso che altre risposte siano piuttosto ingenue, nel mondo reale dopo 2 GB di consumo di memoria la tua applicazione si comporterà davvero male. Nella mia esperienza, le GUI in genere diventano massicce, insostenibili dopo molti consumi di memoria.

Questa è stata la mia esperienza, ovviamente la causa effettiva di ciò può essere che gli oggetti diventano troppo grandi quindi tutte le operazioni su quegli oggetti richiedono troppo tempo.

5

Per Windows a 64 bit la dimensione della memoria virtuale è di 16 TB divisa in parti uguali tra la modalità utente e kernel, in modo che i processi utente possano indirizzare 8 TB (8192 GB). Questo è meno dell'intero spazio 16 EB indirizzabile a 64 bit, ma è ancora molto più di quello a cui siamo abituati con 32 bit.

3

Il runtime .NET può allocare tutta la memoria disponibile per i programmi in modalità utente nel suo host. Ricorda che ciò non significa che tutta quella memoria sarà dedicata al tuo programma, in quanto alcune porzioni (relativamente piccole) saranno dedicate alle strutture di dati CLR interne. Nei sistemi a 32 bit, supponendo un'impostazione da 4 GB o più (anche se PAE è abilitato), si dovrebbe essere in grado di ottenere il massimo di circa 2 GB allocati alla propria applicazione. Sui sistemi a 64 bit dovresti essere in grado di ottenere 1 TB. Per ulteriori informazioni sui limiti di memoria di Windows, consultare this page. Ogni cifra menzionata deve essere divisa per 2, in quanto Windows riserva la metà superiore dello spazio indirizzo per l'utilizzo mediante codice in esecuzione in modalità kernel (squillo 0). Inoltre, per favore, ogni volta che per un sistema a 32 bit il limite supera i 4 GB, l'uso di PAE è implicito, e quindi non è ancora possibile superare il limite di 2 GB a meno che il sistema operativo supporti 4gt, nel qual caso è possibile raggiungere fino a 3 GB .

7

La quantità di memoria che il processo .NET può indirizzare dipende sia dal fatto che sia in esecuzione su una macchina a 32/64 bit sia dal fatto che sia in esecuzione come indipendente dalla CPU o processo specifico della CPU.

Per impostazione predefinita, un processo .NET è indipendente dalla CPU, quindi verrà eseguito con il tipo di processo che è naturale per la versione di Windows. A 64 bit sarà un processo a 64 bit e a 32 bit sarà un processo a 32 bit.È possibile forzare un processo .NET per indirizzare una particolare CPU e dire eseguirlo come un processo a 32 bit su una macchina a 64 bit.

Se si esclude la grande cornice a conoscenza degli indirizzi, i seguenti sono varie ripartizioni processo

  • 32 bit può indirizzare 2GB
  • processo
  • 64 bit può indirizzare 8TB

Ecco un link alla ripartizione completa dello spazio indirizzabile in base alle varie opzioni fornite da Windows.

http://msdn.microsoft.com/en-us/library/aa366778.aspx

0

Il seguente post del blog ha dettagliato i risultati su x86 e x64 di memoria max. Ha anche un piccolo strumento (fonte disponibile) che consente di estare facilmente le diverse opzioni di memoria: http://www.guylangston.net/blog/Article/MaxMemory.

5

Recentemente ho eseguito una profilazione approfondita sui limiti di memoria in .NET su un processo a 32 bit. Siamo tutti bombardati dall'idea che possiamo allocare fino a 2,4 GB (2^31) in un'applicazione .NET ma sfortunatamente questo non è vero :(. Il processo di applicazione ha così tanto spazio da usare e il sistema operativo fa un grande Tuttavia, lo stesso .NET sembra avere il proprio overhead che rappresenta approssimativamente 600-800 MB per le tipiche applicazioni del mondo reale che spingono il limite di memoria. Ciò significa che non appena si assegna un array di numeri interi che richiede circa 1.4GB, si dovrebbe aspettare di vedere un OutOfMemoryException().

Ovviamente in 64bit, questo limite si verifica così tardi (la Chat in 5 anni :)), ma la dimensione generale di tutto ciò che nella memoria cresce anche (mi sto trovando va da ~ 1.7 a ~ 2 volte) a causa della maggiore dimensione della parola.

Quello che so per certo è che l'idea di memoria virtuale dal sistema operativo NON ti dà assolutamente spazio di allocazione praticamente infinito all'interno di un unico processo. È solo lì in modo che l'intero 2,4 GB è indirizzabile a tutte le (molte) applicazioni in esecuzione contemporaneamente.

Spero che questa intuizione aiuti un po '.

Originariamente ho risposto qualcosa legato qui (io sono ancora un newby quindi non sono sicuro di come dovrei fare questi collegamenti):

Is there a memory limit for a single .NET process

+0

Perché volevi pubblicare questa stessa risposta più volte? –

+0

Siamo spiacenti, sono un noob. Come colleghi le domande e le risposte relative a questo sito? –

Problemi correlati