Java-Speicherverwendung bei Vererbung

8

Wie sieht die Speichernutzung in Java aus, wenn eine Basisklasse erweitert wird?

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

%Vor%

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)

    
Linuxxon 17.09.2014, 12:48
quelle

2 Antworten

8

Es gibt keinen doppelten Aufwand.

Java wird die Klasse, die Oberklassen, verwenden, um den für alle Felder benötigten Platz zu berechnen und den für eine einzelne Instanz benötigten Platz zuzuordnen.

Bilden Sie nur einen Memory Point of View, es gibt überhaupt keinen Superklassenbegriff, es gibt eine Instanz von Foo, die Speicher für nur einen int benötigt, und Instanzen von Bar, die Speicher für zwei Inte brauchen, von denen einer ist dort, weil Bar Foo erweitert.

Der Overhead (oder die Buchhaltung oder was immer Sie anrufen wollen) passiert nur einmal.

Allerdings ist es beim Entwickeln in Java 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 Buchhaltungs-Overhead 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 Gesamtperformance verbessern können, anstatt sich über den Speicheraufwand jeder einzelnen Instanz Gedanken zu machen.

    
Simone Gianni 17.09.2014, 12:55
quelle
2

Es gibt nur einen Klassenkopf pro Objekt, also nur das letzte.

Übrigens können Sie dies einfach mit Ссылка oder Ссылка

    
llogiq 17.09.2014 12:54
quelle

Tags und Links