2010-09-01 11 views
7

Können wir eine beliebige Größe eines Java-Objekts ohne Angst vor einer Ausnahme haben? Ich werde ein Objekt einer Klasse verwenden, die aus einer ArrayList Tausende anderer Objekte besteht, die Paare HashMap s und ArrayList s und viele andere nicht primitive Typen enthält.Hat ein Objekt in Java Speicherbeschränkungen?

Danke

Antwort

2

Java Heap ist eine Begrenzung für die Größe von Objekten, die Sie im System haben können. Wenn die Größe Ihres Objekts außerhalb des Heapspeichers liegt, wird der Fehler "Nicht genügend Arbeitsspeicher" generiert.

In Ihrem Fall ist die Gesamtgröße Ihres Objekts (Objekt in ArrayList + anderen Objekten in Ihrem System) wichtiger, da Ihre ArrayList nur auf diese Objects verweist.

Hier sind VM-Optionen können Sie Heap-Größe wie pro Ihre Anforderung (von the java documentation) verwenden zu setzen:

-Xmsn

Geben Sie die Anfangsgröße in Byte von der Speicher Zuteilungspool. Dieser Wert muss ein Vielfaches von 1024 größer als 1MB sein. Fügen Sie den Buchstaben k oder K zu geben Kilobyte oder M oder M zu Megabyte angeben. Der Standardwert ist 2 MB. Beispiele:

 
     -Xms6291456 
     -Xms6144k 
     -Xms6m 

-Xmxn

Geben Sie die maximale Größe, in Bytes, von die Speicherzuordnung Pool. Dieser Wert muss ein Vielfaches von 1024 größer als 2MB sein. Fügen Sie den Buchstaben k oder K zu geben Kilobyte oder M oder M zu Megabyte angeben. Der Standardwert ist 64 MB.Beispiele:

 
     -Xmx83886080 
     -Xmx81920k 
     -Xmx80m 

prüfen Heap Infos von VM Spec

3.5.3 Heap

Die Java Virtual Machine einen Haufen hat, die unter allen Java Virtual Machine> Threads gemeinsam genutzt wird. Der Heap ist der Laufzeitdatenbereich, aus dem Speicher für alle Klasseninstanzen und Arrays zugewiesen wird. Der Heap wird beim Start der virtuellen Maschine erstellt. Heap-Speicher für Objekte wird durch ein automatisches Speicherverwaltungssystem (bekannt als Garbage Collector) zurückgewonnen; Objekte werden nie explizit freigegeben. Die virtuelle Java-Maschine nimmt keinen besonderen Typ von automatischem Speicherverwaltungssystem an, und die Speicherverwaltungstechnik kann entsprechend den Systemanforderungen des Implementierers gewählt werden. Der Heap kann eine feste Größe haben oder, wie von der Berechnung gefordert, erweitert werden und kann zusammengezogen werden, wenn ein größerer Heap unnötig wird. Der Speicher für den Heap muss nicht zusammenhängend sein.

Eine Java Virtual Machine-Implementierung kann dem Programmierer oder dem Benutzer die Kontrolle über die anfängliche Größe des Heapspeichers sowie, falls der Heap dynamisch erweitert oder> kontrahiert werden kann, Kontrolle über die maximale und minimale Heap-Größe geben. 5

die folgenden Ausnahmezustand mit dem Heap zugeordnet:

Wenn eine Berechnung als mehr Heap benötigt, kann durch die automatische Speichermanagement-System zur Verfügung gestellt werden, die Java Virtual Machine ein OutOfMemoryError wirft.

0

Sie keine Größe Objekt ohne Auswirkungen nicht verwenden können. Sie können programmieren, was Sie wollen, aber Sie müssen natürlich die JVM und die typischen Speicher-/Heap-Grenzen kennen, die darin verwendet werden.

0

Der einzige begrenzende Faktor ist die maximale Größe des Heapspeichers, ich hatte auch ein paar 100MB Fett-Objekt als im Speicher db.

0

Natürlich hat es Einschränkungen der Speichergrenze. Sie können den Heapspeicher jedoch steuern, indem Sie ihn auf eine höhere Größe initialisieren. Aber das garantiert nicht, dass Sie unbegrenzten Speicher verwenden können, wie Sie möchten.

13

Wenn Sie ein Objekt haben (sie es A nennen), die ein ArrayList mit vielen, vielen Objekten in ihr verweist, die „Größe“ A noch ziemlich klein sein (die Größe der Referenz plus einem wenig Overhead) . Objekte, die von A referenziert werden, sind ziemlich unabhängig von A. Die einzige Grenze ist, dass die Gesamtgröße aller Objekte durch den verfügbaren Speicher begrenzt ist.

Das einzige wahrhaft "riesige Objekt" wäre eines mit vielen, vielen Feldern, aber die JLS/JVM-Spezifikation legt ein ziemlich kleines Limit fest (das fields_count in the class file format ist ein u2 Feld, so dass Sie maximal 65 535 Felder haben können) .

+10

Verdammt, ich entwarf gerade ein Objekt mit 65536 Feldern :( – fish

+4

@fish: das ist kein Design, das ist ein Unfall ;-) –

0

Das allgemeine Heap-Limit ist die Hauptspeicherbeschränkung. Solange deine Objekte in diese passen, wirst du gut sein.

Sie können dies testen, wenn Sie möchten, indem Sie viele große Arrays zuweisen und beobachten, wenn Sie OutOfMemoryErrors erhalten.

Aufgrund der Größe von Integer-Indizes gibt es auch eine Array-Größenbeschränkung von 2147483647. Ich habe jedoch nie gesehen, dass jemand in der Praxis darauf gestoßen ist.

Verwandte Themen