Speicherbelegung byte, short, int

hdi

Top Contributor
Hey,

Heute hat ein Kollege behauptet, dass byte short und int gleich viel Speicher belegen, da es theoretisch zwar einen Unterschied gibt, Java allerdings nur mit 4-Byte Chunks als kleinste Einheit umgehen kann. Das wär mir neu?! Ich hab jetzt ganz kurz über Runtime#free/maxMemory getestet mit einem int-Array und einem byte-Array, beide 1 Mio Slots.

das int-Array belegt 4.000.016 byte, das byte-Array 1.000.016 Million. Ist für mich auch logisch denn ein int belegt 4 byte und ein byte belegt.. nun ja ;) Und die 16 kommen wohl vom Overhead des Arrays selbst. edit: Ja und short-Array belegt 2.000.016, passt also auch.

Bevor ich morgen zu dem hinrenn und ihn zur Sau mach wollte ich aber doch nochmal nachfragen. Immerhin ist das Testen der Speicherbelegung ja so ne Sache - man kann das jetzt nicht auf's byte genau nachvollziehen (Mach ich das Array 10 Mio Slots groß kommen die selben Werte heraus, bei 100 Mio Slots kommt sogar eine Negativ-Belegung raus, d.h. er hat mit dem Anlegen des Arrays sogar Speicher gewonnen.. :autsch:)

Also wie is das nun. Ist da vllt doch etwas dran, und ich hab ihn nur falsch verstanden bzw er sich schlecht ausgedrückt, oder habt ihr davon auch zum ersten mal gehört? Hat da jemand detaillierte Lektüre? Ich kenne halt nur die typischen Tabellen wo ja eig. auch klar drinsteht dass die unterschiedlich viel Speicher belegen.

lg
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ja, solche Messungen über Runtime sind wirklich nicht sehr zuverlässig - ich frag' mich wo da diese hypergenauen 16 bytes herkommen - kam das wirklich rechnerisch genau so raus? Wäre fast Zufall, weil der Heap ja auch vergrößert werden kann (was auch den "magisch auftauchenden" Speicher erklären könnte).

Wie auch immer: Ein int[n]-array belegt 4 mal so viel Speicher wie ein byte[n]-Array. Das ist so, und notfalls kann man die Daten auch mal mit JNI zu C rüberziehen und mit GetPrimitiveArrayCritical schauen, was denn dort steht, wo dieser Zeiger hinzeigt: Einmal sind es 4-byte-ints, und einmal 1-byte-bytes.

Was dein Kollege vielleicht gemeint haben könte: Auf dem Stack (also dort, wo wirklich rumgerechnet wird, tief im Inneren der JVM) gibt es in bezug auf den "Speicher" keinen Unterschied: Auf dem Stack liegen immer 32bit, egal ob das nun bytes, shorts oder ints sind.
 

hdi

Top Contributor
Ah okay, also das heißt:

lokale , primitive Variablen belegen immer mindestens 4 byte. (Du sagtest jetzt immer (genau) 4 byte, aber was ist mit long oder double?)

Aber alles andere, d.h. Objekte mitsamt deren Werten für Instanz-Variablen (und auch Klassen-Variablen??), belegen soviel Speicher wie es die typischen Tabellen anzeigen.

Hab ich das richtig verstanden?
 

Marco13

Top Contributor
Erstmal vorneweg: Objekte sind nochmal was ganz anderes - ich weiß aber nicht, welche "typischen Tabellen" du gerade meinst ???:L

Lokale primitive Variablen sind eigentlich nochmal was anderes, als der Stack, von dem ich geredet hatte - aber es gelten bei beiden etwa die gleichen Regeln:

Ein "Eintrag" des Stacks kann beliebige Datentypen aufnehmen. Ich hatte jetzt gesagt, dass das 32bit wäre, und die Frage nach long und double drängt sich auf, aber die belegen sozusagen (!) zwei "Einträge". Genaugenommen steht in der VM-Spec:
VM Spec The Structure of the Java Virtual Machine
3.6.2 Operand Stacks
...
Each entry on the operand stack can hold a value of any Java virtual machine type, including a value of type long or type double.
...
(Das klingt jetzt erstmal, als müßte ein "Eintrag" 64 bit haben, aber weiter unten steht...)
3.6.2 Operand Stacks
...
At any point in time an operand stack has an associated depth, where a value of type long or double contributes two units to the depth and a value of any other type contributes one unit.
...
Somit sind für ALLE Typen die Einträge 32 bit groß, und für long und double eben 2*32, auch wenn diese 2 "slots" dann trotzdem noch als "EIN (abstrakter) 'Eintrag'" bezeichnet werden.


Für lokale Variablen sieht's ähnlich aus:
VM Spec The Structure of the Java Virtual Machine
3.6.1 Local Variables
...
A single local variable can hold a value of type boolean, byte, char, short, int, float, reference, or returnAddress. A pair of local variables can hold a value of type long or double.

Also haben lokale Variablen auch 32 bit - und für long und double werden dann eben, wie beim Stack, 2*32 bit verwendet.
 

hdi

Top Contributor
Also ich kenne den Stack nur als eben der Speicherbereich in dem lokale Variablen (mit ihren Werten) liegen. Von welchem Stack du jetzt redest ist mir nicht ganz klar.. Aber wie du schreibst ist das diesbezüglich ja das selbe. Und die Sache mit den Objekten hab ich erwähnt weil ich Stack im Zusammenhang mit Heap kenne, wobei eben gilt: Stack = lokale Variablen (für jeden Thread), Heap = Objekte (global für alle Threads zusammen)

PS: Mit typische Tabellen meinte ich die Auflistung der primitiven Typen mit ihrem Wertebereich und eben der Speicherbelegung:
Java Standard: Primitive Datentypen ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher
 

Marco13

Top Contributor
Hmja, aber die JVM selbst arbeitet ja mit einem Stack (grob wie auf Kellerautomat ? Wikipedia beschrieben - aber schon praktisch ;) )

Sinngemäß-vereinfacht: Wenn im Code eine Rechnung steht wie
d = a+b+c
dann wird
- a auf den Stack gepusht
- b auf den Stack gepusht
- Die beiden oberen Stackelemente addiert und das Ergebnis auf den Stack gepusht
- c auf den Stack gepusht
- Die beiden oberen Stackelemente addiert und das Ergebnis auf den Stack gepusht
- Das obereste Element des Stacks ist dann a+b+c, also d

Der Stack dort ist nochmal was anderes als der Stack der z.B. die Parameter-Variablen bei Methodenaufrufen speichert.

Ehrlich gesagt weiß ich über die Oragnisation des Heaps nicht so viel (das ganze bisher hatte ich mir nur mal für die Implementierung eines Class-File-Readers reingezogen) aber man kann wohl sagen: Jede Variable belegt mindestens 32bit - außer wenn sie ein Array-Element ist.

Z.B. würde sowas wie
Java:
class SomeClass
{
    private byte b0;
    private byte b1;
...
    private byte b1000;
}
auf dem Heap 1000 * 4 byte (!) belegen, während
Java:
class SomeClass
{
    private byte b[] = new byte[1000];
}
1 Objektreferenz für den Array, aber dann nur noch 1000 * 1 byte (!) belegen würde.

Vielleicht meinte dein Kollege ersteres? :bahnhof:

Die Tabellen stimmen so natürlich, da geht es aber eher um die Frage, wie groß die Daten sind, die in solchen Variablen gespeichert werden können - weniger darum, wie viel Speicher sie wann wo wirklich belegen - außer natürlich, wenn man Arrays mit solchen Typen erstellt.
 

hdi

Top Contributor
Achso also ist doch nur das Array ne Ausnahme? Das versteh ich nicht.. Ein Array ist doch quasi ein Objekt, also ein Wrapper über mehrere primtive Felder. Wenn ich ne Klasse X mit 10 Instanz-Variablen hab ist es doch eigentlich vom Aufbau das selbe?! Wieso belegt das dann mehr Speicher.. Und wie ist das zB bei ner List? Wenn ich dort 5 bytes reinadde, sind das dann 5 * 1 byte oder 5 * 4 byte?
 

bERt0r

Top Contributor
Naja ein Array ist per se ja nur eine Adresse im Speicher, zu der werden dann eben i * x bytes hinzugezählt und so kommt man auf das jeweils i-te Element (x= Anzahl der bytes des Datentyps).
Wenn du einzelne Variablen hast, hast du auch auf jede Variable einen Zeiger drauf. Und, jetzt rate ich, es wäre auf Maschinencodeebene aufwendiger für sämtliche Variablen die byte länge mitzuspeichern, wenn man sie sowieso auf einen einheitlichen Stack packt. Bei arrays zahlt sich das allerdings aus, weil man da eine Menge gleicher Variablen hat, die praktischerweise noch hintereinander im Speicher stehen.
Bzgl List, da du in eine Collection ja sowieso nur Objekte reinpacken kannst, hast du wohl schon alleine durch ein Wrapper-Objekt mehr als 4 byte beisammen.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Achso also ist doch nur das Array ne Ausnahme? Das versteh ich nicht.. Ein Array ist doch quasi ein Objekt, also ein Wrapper über mehrere primtive Felder. Wenn ich ne Klasse X mit 10 Instanz-Variablen hab ist es doch eigentlich vom Aufbau das selbe?!

Hmnee... ein Array und eine "richtige" Klasse ist ja schon ein Unterschied. In einer Klassen können die Fields ja verschiedene Typen haben, und sie haben Namen - ein Array ist ganz dediziert nur ein "roher Speicherblock", bei dem man über einen Index einzelne Elemente ansprechen kann, die aber alle denselben Typ haben...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JNA Speicherbelegung der Datentypen Allgemeine Java-Themen 13
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
D byte[] problem Allgemeine Java-Themen 3
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
J byte-Array als String übers http schicken Allgemeine Java-Themen 8
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
L byte[] to int Allgemeine Java-Themen 2
M Vector zu einem byte[] Allgemeine Java-Themen 5
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben