• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Speicherbedarf

TimoN11

TimoN11

Mitglied
Hey,
Wie viel Bytes benötigt ein Objekt von:

1612260188007.png


Ich habe 213 Byte raus, aber das scheint falsch zu sein.
Ich habe gerechnet:
1x byte = 1 Byte
2x long = 16 Byte
1x int = 4 Byte
12x char = 24 Byte
18x float = 72 Byte
24x int = 96 Byte
Würde mich über eure Hilfe freuen.
Danke
 
Zuletzt bearbeitet:
L

LimDul

Top Contributor
Warum macht man sowas?

Grundsätzlich würde ich die JLS zu Rate ziehen (Ist jetzt java 8, aber sollte egal sein):
Dort ist schon mal definiert, wie viel die primitiven Typen brauchen. (char ist .z.B. 2 Byte)

Und bezüglich Arrays ist das beste was ich finde das hier

das heißt, für das char-Array var4 sollten 24 Byte reserviert werden
Für das float array var5 entsprechend 6*9*3*4 (Float hat 4 Byte) => Also 648 Byte (Damit wäre ich schon deutlich über deinen 213 Byte)
usw.
 
TimoN11

TimoN11

Mitglied
Achso, danke dir.
Genau so habe ich es auch gerechnet, aber bei den Arrays habe z.B. bei float array var5 -> 6*4+9*4+3*4 gerechnet, somit auf 72 Bytes gekommen.

Verbraucht der Aufruf der Klasse auch Bytes? Hab irgendwas davon gelesen das der 4 Byte verbraucht, aber denke das habe ich falsch verstanden.
Grüße,
 
L

LimDul

Top Contributor
Achso, danke dir.
Genau so habe ich es auch gerechnet, aber bei den Arrays habe z.B. bei float array var5 -> 6*4+9*4+3*4 gerechnet, somit auf 72 Bytes gekommen.
Bei deiner Rechnung hieße das ja, das den Array 6+9+3 = 18 Elemente gespeichert werden können. Aber es ist ja ein mehrdimensionales Array.

Beispiel
Java:
float tictactoe[] = new float[3][3]
Das reicht um ein Tic-Tac-Toe Feld abzudecken, das ist ja ein 3x3 Array und kann daher 9-Elemente speichern. Mti der Rechnung von dir wären es ja nur 6 Elemente

Verbraucht der Aufruf der Klasse auch Bytes? Hab irgendwas davon gelesen das der 4 Byte verbraucht, aber denke das habe ich falsch verstanden.
Grüße,
Kann gut sein, an der Stelle bin ich raus, weil sowas vielleicht für Zertifkate relevant sein mag, aber in der Praxis komplett irrrelevant ist. Müsste man die JLS mal durchsehen
 
kneitzel

kneitzel

Top Contributor
Verbraucht der Aufruf der Klasse auch Bytes?
Also "Aufruf" ist auf jeden Fall das falsche Wort. Aber eine Klasse benötigt natürlich einen Overhead, denn es muss ja bekannt sein, was da gespeichert wird. https://shipilev.net/jvm/objects-inside-out/#_methodology_considerations könnte da interessant sein. Wirklich alles mal versuchen nachzuvollziehen. Für das Verständnis ist es wichtig. Object Size wäre dann unter 6.2 im Detail.

Dann ist die Frage, wie man die Arrays berechnet. Die Klasse selbst speichert ja nur eine Referenz auf die Arrays. Daher sind die Arrays streng genommen erst einmal nicht Bestandteil des Objekts. Und Referenzen wird dann auch direkt interessant - man kann ja in die Implementation schauen und dann findet man CompressedReference und so ... Also auch das ist nicht trivial.

Wenn man die Größe eines Arrays berechnen möchte, dann ist da natürlich auch der Overhead zu beachten. Da hat man die 12 bytes jeder Klasse + 4 Bytes für die Array Größe. (nach dem oben genannten Link)

Dann wird auch ausgerichtet. Also auch wenn ein byte nur 1 Byte benötigt, sind dann wohl 4 Bytes belegt fürchte ich ...

Und das ist eine Implementationsfrage. Wenn ich das OpenJDK clone und jedem Objekt ein größeren Header gebe oder ich da auf 256Bit CPUs optimieren will und daher entsprechend alle Elemente Ausrichte oder oder oder ....

Aber es gibt auf jeden Fall einen Anhaltspunkt, was da ggf. zu berücksichtigen ist. Die genaue Fragestellung im Wortlaut wird dann ggf. interessant und wenn es Dir um eine Zertifizierung geht: Was die Macher denn als richtige Antwort erwarten....
 
I

ImmerDieseKinder

Mitglied
Der Speicher-Overhead variiert in Java bei mehrdimensionalen Arrays, das heißt, dazu lässt sich keine Aussage treffen. In der JLS steht dazu auch nix.

Es kann auch einen unterschied machen, ob du new int[10][20] oder new int[20][10] schreibst.
 
kneitzel

kneitzel

Top Contributor
Der Speicher-Overhead variiert in Java bei mehrdimensionalen Arrays, das heißt, dazu lässt sich keine Aussage treffen. In der JLS steht dazu auch nix.

Es kann auch einen unterschied machen, ob du new int[10][20] oder new int[20][10] schreibst.
Ja, das ist ein wichtiger Punkt. Ist auch einfach zu erklären: Es gibt keine mehrdimensionalen Arrays. Somit sind das Arrays von Arrays.

Also einmal hast Du ein Array mit 10 Elementen, die jeweils ein Array mit 20 Elementen enthalten (11 Arrays -> 11 Mal der Overhead)
Beim anderen hast Du ein Array mit 20 Elementen, die jeweils ein Array mit 10 Elementen enthalten (21 Arrays -> 21 Mal der Overhead)
 
L

LimDul

Top Contributor
Im Endeffekt kann die Frage zwei Hintergründe haben:

a) Nur um z.B. bei Studenten abzufragen, ob sie verstanden haben wie viel bit ein char, float etc. haben. => Die obige Rechnung, die ich gemacht habe, löst die Frage.
b) Für irgendwelche Oracle Java Zertifizierungen oder ähnliches Dinge abfragen die man nie braucht. Mein Beileid und was dann die exakt richtige Antwort ist, bin ich raus :)
 
L

LimDul

Top Contributor
Der Speicher-Overhead variiert in Java bei mehrdimensionalen Arrays, das heißt, dazu lässt sich keine Aussage treffen. In der JLS steht dazu auch nix.

Es kann auch einen unterschied machen, ob du new int[10][20] oder new int[20][10] schreibst.
Es ist festgelegt, in welcher Reihenfolge die angelegt werden:

  • First, the dimension expressions are evaluated, left-to-right. If any of the expression evaluations completes abruptly, the expressions to the right of it are not evaluated.
  • Next, the values of the dimension expressions are checked. If the value of any DimExpr expression is less than zero, then a NegativeArraySizeException is thrown.
  • Next, space is allocated for the new array. If there is insufficient space to allocate the array, evaluation of the array creation expression completes abruptly by throwing an OutOfMemoryError.
  • Then, if a single DimExpr appears, a one-dimensional array is created of the specified length, and each component of the array is initialized to its default value (§4.12.5).
  • Otherwise, if n DimExpr expressions appear, then array creation effectively executes a set of nested loops of depth n-1 to create the implied arrays of arrays.

Dann sind sogar Beispiele, wie die angelegt werden. Ob das reicht um den Speicherbedarf zu berechnen, keine Ahnung.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Der Speicher-Overhead variiert in Java bei mehrdimensionalen Arrays, das heißt, dazu lässt sich keine Aussage treffen. In der JLS steht dazu auch nix.

Es kann auch einen unterschied machen, ob du new int[10][20] oder new int[20][10] schreibst.
Da gibts keinen Unterschied zwischen Arrays und Objekten, der Speicherbedarf lässt sich (vorausgesetzt man kennt die JVM-Parameter) immer genau berechnen.
 
I

ImmerDieseKinder

Mitglied
Da gibts keinen Unterschied zwischen Arrays und Objekten, der Speicherbedarf lässt sich (vorausgesetzt man kennt die JVM-Parameter) immer genau berechnen.
Diese Aussage ist unsinnig, da die "Parameter" von JVM implementation zu JVM implementation variieren.

Man kann natürlich den benötigten Speicherbedarf messen, aber auch die Messungen werden variieren.

Also wie immer erst denken, dann antworten.
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben