2014-09-17 14 views
8

Wie sieht die Speicherauslastung in Java aus, wenn eine Basisklasse erweitert wird?Java-Speicherverwendung in Vererbung

Enthält die untergeordnete Klasse eine Instanz der Basisklasse (mit eigenem Overhead und alle) oder hat sie nur einen eigenen Overhead von 16 Bytes?

class Foo { 
int x; 
} 

class Bar extends Foo { 
int y; 
} 

Also, genauer gesagt, was ist der Speicherverbrauch einer Instanz von Bar?

Ist es Foo (including overhead) + Bar(including overhead)

oder nur Foo (excluding overhead + Bar(including overhead)

+0

Es gibt nur einen Header und nur ein Objekt. Die Felder von Bar sind unmittelbar nach den Feldern von Foo im Speicher. –

Antwort

8

Es gibt keine zwei oben liegende.

Java nimmt die Klasse, die Oberklassen, berechnet den Platz, der für alle Felder benötigt wird, und reserviert den Platz, der für eine einzige Instanz benötigt wird.

Nur einen Speicherpunkt bilden, gibt es nicht den Begriff der Oberklasse überhaupt, es gibt Instanz von Foo, die Speicher für nur ein int benötigen, und Instanzen von Bar, die Speicher für zwei Eingänge benötigen, von denen eins ist da, weil Bar Foo erweitert.

Also der Overhead (oder Buchhaltung oder was auch immer Sie anrufen möchten) passiert nur einmal.

Allerdings, wenn Sie in Java entwickeln, ist es normalerweise besser, sich nicht zu sehr um Speicherkram zu kümmern, es sei denn, Sie haben sehr spezifische (und ich meine sehr sehr sehr spezifische) Anwendungsfälle, bei denen der Buchhaltungsaufwand Ihnen ernste Probleme bereitet. In diesem Fall sollte auch das 8-Byte-Padding berücksichtigt werden.

Normalerweise gibt es viele andere Möglichkeiten, wie Sie den Speicherbedarf Ihrer Anwendung oder die Gesamtleistung verbessern können, anstatt sich über den Speicheraufwand jeder einzelnen Instanz Gedanken zu machen.

+0

Sagen wir, ich möchte nur einen Teil einer Klasse verwenden - wodurch ein Objekt der ganzen Klasse Speicher belegt. Wenn diese Klasse stattdessen in einen Superklassen-Teil und eine Unterklasse aufgeteilt würde, würde ich nur den Teil, den ich brauche, instanziieren - was meine Anwendung etwas speichereffizienter macht. Ist das korrekt? – Lealo