2009-06-11 5 views
9

Ich habe gelesen (http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx), dass die maximale Größe eines Objekts in .NET 2 GB ist..NET Max Speicher Verwenden Sie 2 GB sogar für x64 Assemblies

Ich bin richtig in der Annahme, dass, wenn ich ein Objekt habe, das 256 MB Speicher belegt, da es ein Referenztyp ist, kann ich ein Array dieser 256 MB Objekte haben, wo alle Objekte zusammen> 2GB Speicher als aufnehmen können Solange die Größe des Referenzarrays unter 2 GB bleibt?

+0

Interessante Frage. Ich wusste nicht, dass dieses Limit für eine 64-Bit-Maschine gelten würde. Das heißt, ich kann nicht viele Szenarien für eine App, die 2 GB in einem Objekt hält! – RichardOD

+0

Ich stimme zu, es gibt nicht viele Szenarien, in denen Sie mehr als 2 GB in einem einzigen Objekt benötigen würden. Ein Spielserver oder Datenbankserver ist wirklich das einzige, was einem einfällt. – Nate

Antwort

10

Ja, Ihre Annahme ist richtig.

Die 2-GB-Grenze gilt für jedes Objekt einzeln. Der Gesamtspeicher für alle Objekte kann 2 GB überschreiten.

(Ob die Laufzeit der Lage ist, genügend Speicher für Ihre Anforderungen ist eine andere Sache zu vergeben. Ich bezweifle, dass es eine volle 2 GB-Ersatzspeicher auf einem 32-Bit-Maschine finden konnte, aber es sollte kein Problem auf 64-Bit sein.)

+0

Also wird das "Referenz-Array" ein Objekt sein, das (typischerweise) den gleichen Platzbedarf wie ein "Integer-Array" einnehmen würde? – Nate

+1

Nate> es ist ein Implementierungsdetail aber Referenzen sind zZ Zeiger und so haben sie die gleiche Größe wie die Zeigergröße (In C war es das gleiche wie die Größe von (int) auf den meisten Systemen, aber in C# int immer Int32) –

+0

Dies ist seltsam, wenn man bedenkt, dass die Array-Klasse von .NET spezielle Methoden hat, die "lange" Array-Längenargumente verwenden. Wenn das Limit 2 GB ist, ist es unmöglich, dass eine Array-Länge einen 32-Bit-Int überläuft. – Qwertie

6

"In .NET 4 und früher konnte kein Objekt größer als 2 GB sein, auch nicht in 64-Bit-Prozessen. Für bestimmte Workloads, die große Arrays verwenden, kann diese Größenbeschränkung jedoch eingeschränkt sein. NET 4.5 unterstützt die Aufhebung der Begrenzung für Arrays in 64-Bit-Prozessen, so dass Arrays größer als 2 GB sein können, dh Sie könnten beispielsweise ein Array von Int32.MaxValue Int32s zuweisen, obwohl ein solches Array 8 GB benötigt. Große Objekte in .NET werden auf einem speziellen Heap zugewiesen, nicht zufällig als Large Object Heap (LOH); .NET 4.5 hat auch erhebliche Leistungsverbesserungen für die LOH gesehen, einschließlich der Verwendung besserer Algorithmen zur Verwaltung von freiem Speicher im 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

Verwandte Themen