2009-09-18 4 views
13

Ist es richtig anzunehmen, ein Java-Objekt nimmt nur die 8 Bytes für die Objektreferenz auf, solange alle seine Mitglieder auf null gesetzt sind oder benutzt die Definition von Mitgliedern bereits Speicherplatz in der Instanz aus irgendeinem Grund?Wie viel Speicher verwendet ein Java-Objekt, wenn alle seine Mitglieder null sind?

Mit anderen Worten, wenn ich eine große Sammlung von Objekten habe, die Platz sparend sein sollen, kann ich damit rechnen, dass nicht verwendete Elemente auf null gesetzt werden, um den Speicherbedarf zu reduzieren?

Antwort

17

Nein, Sie benötigen entweder 4 oder 8 Byte (abhängig davon, ob es sich um ein 32- oder 64-Bit-System handelt) für jede Null, die Sie in einem Feld speichern. Wie würde das Objekt wissen, dass sein Feld null ist, wenn es nicht irgendwo etwas gespeichert hat, um es zu sagen?

+0

Ja, gute Frage. :) Also entspricht ein Feld einem C-Zeiger (der auch Speicher für sich selbst benötigt)? –

+0

Ja, Variablen von Referenztypen (Klassen) sind Verweise auf Objekte auf dem Heap, die den C-Zeigern entsprechen. Der Speicher würde für den Zeiger und für das Objekt, auf das er zeigt, verwendet werden. Primitive Typen wie int werden direkt gespeichert und haben immer die gleiche Größe. – Joe

6

Nein, null ist auch Information und muss auch gespeichert werden.

0

Was ist mit Klassen-, Objekt- und Methodennamen? Wie Sie aufrufen können, greifen Sie auf sie zu oder instanziieren Sie sie mit Java reflect, die Namen müssen auch irgendwo gespeichert werden, oder? Aber CMIIW.

Kage

+1

Diese werden nicht pro Instanz gespeichert. – CPerkins

+0

Wahr. Die ursprüngliche Frage betraf die Raumkosten der Objekte. Vielen Dank :-). – Kage

1

Das Objekt verweist selbst wird noch einige Speicher aufnehmen, so dass die einzige wirkliche Speichereinsparungen von den Heapobjekte sein wird, auf die verwiesen worden wäre.

Also, wenn Sie

MyClass { 
    public Object obj; 
    MyClass(Object o) { obj = o; } 
} 

MyClass a = new MyClass(new HashMap()); 
MyClass b = new MyClass(null); 

die beiden Objekte a und b haben sich die gleiche Menge an Speicher benötigen (beide halten eine Referenz), aber das Objekt obj bezeichnet durch a nimmt Speicher auf der Heap, also könnte dieser Speicher durch Setzen des Verweises auf Null gespeichert worden sein.

1

Die Java Language Specification und die Java Virtual Machine Specification sagen nichts über die Größe von Java-Objekten im Speicher aus - sie ist absichtlich nicht definiert, weil sie von der Implementierung der JVM abhängt. Dies bedeutet, dass Sie keine Annahmen darüber treffen können, wie viel Speicher ein Java-Objekt im Allgemeinen verwendet oder wie das Speicherlayout eines Java-Objekts im Speicher ist.

Wie andere schon gesagt haben: Eine Referenz (Variable) belegt Speicher, ob die Referenz null ist oder nicht. Ihre Objekte werden nicht verkleinert und belegen weniger Speicherplatz, wenn Sie Elementvariablen auf null festlegen.

0

Wenn ein Java-Objekt alle Mitglieder null hat, wird es Speicher belegen, weil Es hat auch einige zusätzliche Speicheranforderungen für Header, Referenzierung und Housekeeping.

Der Heap-Speicher durch ein Objekt enthält Java verwendet

  • Speicher für primitive Felder, entsprechend ihrer Größe.

  • Speicher für Referenzfelder (je 4 Byte).

  • ein Objektkopf, bestehend aus ein paar Bytes "Housekeeping" Informationen.

Objekte in Java erfordern auch einige „Housekeeping“ Informationen, wie zum Beispiel der Klasse eines Objekts, ID und Statusflags Aufzeichnung wie, ob das Objekt gerade erreichbar ist, die derzeit Synchronisations gesperrt usw.

Java-Objekt Header-Größe variiert auf 32 und 64 Bit jvm.

Obwohl dies die Hauptspeicherverbraucher sind, benötigt jvm auch zusätzliche Felder, manchmal wie für die Ausrichtung des Codes e.t.c.

Dies ist der Grund, wenn Ihr Java-Objekt hat alle seine Mitglieder Null sind, dann wird es Speicher verbrauchen.

Verwandte Themen