Ho un List<Matrix4>
, dove Matrix4
è una struttura contenente 16 float, quindi utilizza 16 * 4 byte = 64 byte.C# List <T> eccezione di memoria esaurita ma lontano dal limite di 2 Gb
Quando si aggiungono voci all'elenco, viene generata un'eccezione di memoria insufficiente quando si supera la linea da 1 milione.
So che .NET hanno un limite di 2 GB per oggetto, ma a meno che io sono completamente fuori di testa:
1.000.000 * 64 byte = ~ 61mb
che non è nemmeno vicino fino al limite.
Quando inizio a compilare l'elenco, in base al task manager, la mia applicazione utilizza 896mb e quando raggiungo l'eccezione utilizza 1028mb.
Il computer ha 8 GB di memoria fisica ma utilizza solo 6 GB.
Eventuali indizi sul perché potrebbe accadere?
--- UPDATE ----
modifica dell'obiettivo piattaforma x64 risolto il problema in un progetto di test separato. Sfortunatamente il progetto originale non può essere x64 i riferimenti dovuti alle DLL x86 che non funzionano su x64. Ma questo è un altro problema.
Non ho pensato di cambiarlo in x64 perché sembrava essere lontano dai limiti di memoria, ma immagino che Hans Passant avesse ragione a 122mb essendo troppo vicino al limite di 1,3 Gb. Grazie a tutti.
Non è la risposta, ma non è possibile contare l'allocazione di memoria .NET in questo modo. –
è necessario utilizzare gli strumenti in Visual Studio per profilare l'utilizzo della memoria. https://msdn.microsoft.com/en-us/library/dn342825.aspx –
Non penso che sia la risposta anche. Ma ogni oggetto in .NET ha un'intestazione con informazioni. Nell'app a 32 bit l'intestazione è lunga 8 byte, nell'app 64 bit l'intestazione è lunga 16 byte. Quindi, OGNI float consuma 12 byte di lunghezza (nell'app a 32 bit). Senza vedere altro di codice è impossibile punto qual è il problema. –