Datentypen interner Speicherverbrauch x64 long vs. int

thinktank

Mitglied
Hallo!
Ich verarbeite sehr große Tabellen und kann mich bei einem Feld zwischen int und long entscheiden. Kurzer Test auf einer 64bit VM mit gleich großen int und long Arrays hat aber im Profiler nur Speicherverbrauch beim long angezeigt, kein int -> Werden hier ints immer als long gespeichert und verarbeitet? Also habe ich hier gar keine Möglichkeit, Speicherverbrauch zu sparen?

Danke und Grüße,
Holger
 
N

nillehammer

Gast
int --> 32 bit
long --> 64bit
Dabei ist es egal, mit wieviel bit die JVM oder das OS laufen.
 
S

SlaterB

Gast
da nach allen Möglichkeiten zur Sparsamkeit gefragt ist sei in jedem Fall erwähnt,
dass man in einem long zwei int hineinkodieren könnte ;)
 

thinktank

Mitglied
Ja, das hatte ich auch so gedacht. Aber ich verstehe das gerade eh nicht. Folgendes Programm allokiert 800 Millionen Bytes, was eigentlich nur der Größe von einem Long-Array entspricht (64bit/8= 8 * 100 Mill Zeilen):

Java:
public class NewClass7 {

    public static void main(String[] args) throws InterruptedException {
        int cnt = 100000000;
        long[] longA = new long[cnt];
        int[] intA = new int[cnt];
        
        for (int i=0;i<cnt;i++) {
            longA[i] = i*2;
            intA[i] = i;
        }
        while (0!=1) {
            System.out.println("Ready");
            Thread.sleep(1000);
        }
    }
}

Warum sehe ich dem Speicherabbild kein Wert beim int[] Array sonder nur Speicher für long Array?

Stehe ich da auf dem Schlauch?
 

Anhänge

  • 2012-09-27_15h31_28.jpg
    2012-09-27_15h31_28.jpg
    92,5 KB · Aufrufe: 71
S

SlaterB

Gast
warum auch immer, aber ist das dein einziger Test?
die 800 MB reichen doch offensichtlich nur für das long-Array, dann würde das zweite ja gar keinen Speicher verbrauchen,
kann nicht sein, oder braucht dasselbe Programm ohne int[] weniger, die Hälfte?

den Grund zu kennen wäre schön, aber erstmal doch weiter testen,
was zeigt ein Programm z.B. mit nur einem int[] der Größe 15 Mio.?

wenn immer noch genau dasselbe Bild, wäre es z.B. ein Hinweis das irgendeine Alt-Version analysiert wird, unmöglich ist nichts,

wenn aber 15*4 oder 15*8 MB rauskommt, dann hättest du eine schöne Aussage
 
N

nillehammer

Gast
Warum sehe ich dem Speicherabbild kein Wert beim int[] Array sonder nur Speicher für long Array?

Stehe ich da auf dem Schlauch?
Wo auch immer das Speicherabbild herkommt, es passt nicht zum gezeigten Code. Die 32B für das int[] entsprechen nämlich dem Speicherverbrauch eines int-Arrays der Länge 0
Java:
int[] leer1 = new int[0];
// oder
int[] leer2 = {};
Kommen Dir die obigen Zeilen evtl. bekannt vor? Hast/Hattest Du so ein Konstrukt evtl. in Deinem Code? SlaterB's Idee mit der älteren Version klingt für mich plausibel. Mal ein "Project -> Clean" gemacht, JAR/WAR neu gebaut o.ä?
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
[OT]
Und weil's grad so gut passt, zitiere ich einen meiner Profs: "Wer misst, misst Mist." :D
[/OT]
 
S

Spacerat

Gast
[OT]@nilehammer: Apropos Mist... ein Array der Länge 0 hat nur 12 Bytes. 4 Bytes für die Länge und 8 für die Typ-ID. Da 12 aber nicht durch 8 Teilbar ist (die Länge eines Objektes muss durch 8 Teilbar sein) ergeben sich daraus 16 Byte. Das int-Array in dem Bild hätte also die Länge 4 (8 + 8 + 4 * 4). Was sollte denn sonst in den 16 verbleibenden Bytes stehen? (Quelle)[/OT]
BTW.: Wenn man sich das Bild genauer ansieht, erkennt man, dass es bereits ein wenig nach unten gescrollt wurde, das grosse int[] kann also durchaus bereits vor dem long[] aufgetaucht sein.
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
[OT]
Spacerat hat gesagt.:
Apropos Mist... ein Array der Länge 0 hat nur 12 Bytes. 4 Bytes für die Länge und 8 für die Typ-ID. Da 12 aber nicht durch 8 Teilbar ist (die Länge eines Objektes muss durch 8 Teilbar sein) ergeben sich daraus 16 Byte.
Stimmt!! Ich dachte, dass hier einfach die 32 Bits für die Referenz auf das Array-Objekt reserviert sind. Das war aber tatsächlich Mist, weil hier ja Bytes angegeben sind. Deinem Tipp folgend, habe ich mir das Bild nochmal angeschaut. Dort sind bei Objects Allocated 2 angegeben. 2*16Byte = 32 Byte. So erklärt sich das wohl, zwei leere int-Arrays
[/OT]
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
B speicherverbrauch 2dimensionales array - rätsel?! Allgemeine Java-Themen 13
M Analysieren von Speicherverbrauch Allgemeine Java-Themen 5
lacco Speicherverbrauch von Arrays Allgemeine Java-Themen 2
O Speicherverbrauch von Java / VM sehr hoch? Allgemeine Java-Themen 27
G Speicherverbrauch einer Variable Allgemeine Java-Themen 2
G Speicherverbrauch eines Programms Allgemeine Java-Themen 2
L Speicherverbrauch einer Anwendung unter Windows Allgemeine Java-Themen 2
J Speicherverbrauch des Systems ermitteln Allgemeine Java-Themen 4
J Maximalen Speicherverbrauch ermöglichen Allgemeine Java-Themen 2
C Speicherverbrauch von JDialog enorm Allgemeine Java-Themen 6
MCDragon IDEA IntelliJ Integer Number Too Long - Help Allgemeine Java-Themen 1
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
O String in Long Hexerdezimal umwandel Allgemeine Java-Themen 14
O long Fehlermeldung Allgemeine Java-Themen 8
M Map <Long, String> zu Map<String, Long> Allgemeine Java-Themen 9
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
P Berechnungen: unterschiedliche Rundungsfehler bei Long? Allgemeine Java-Themen 3
L Variablen longBitsToDouble(long bits) als int Allgemeine Java-Themen 6
A Datentypen Long.valueOf liefert kein "L" am Ende Allgemeine Java-Themen 3
A Long variable wird negativ??? Allgemeine Java-Themen 1
A Zahl zu lang für Long Allgemeine Java-Themen 3
K Datum+Uhrzeit in Millisekunden (long) umwandeln Allgemeine Java-Themen 7
Z Cast von Long zu Integer funktionert nicht Allgemeine Java-Themen 3
H Time to long Allgemeine Java-Themen 9
I Gleichzeitiger zugriff auf ein Long über Threads Allgemeine Java-Themen 2
G Unterschied Long - Int Allgemeine Java-Themen 9
D LinkedList anhand einer long-Variable der Objekte sortieren Allgemeine Java-Themen 5
J httpclient: Post-method aber trotzdem "URI to long&quot Allgemeine Java-Themen 4
A serial Version UID field of type long Allgemeine Java-Themen 5
C Wenn long int zu klein Allgemeine Java-Themen 17
L intgeger fehler bei long[][] Allgemeine Java-Themen 4
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
TheJavaKid Datum -> long Allgemeine Java-Themen 9
D Object to Long casting Allgemeine Java-Themen 9
U Versions-Konfusion: Ist long kein object? Allgemeine Java-Themen 3
H Linksschieben << bei long-Datentypen Allgemeine Java-Themen 2
B Long.parseLong löst teilweise Exception aus. Allgemeine Java-Themen 2
B long : Java-Bug? Allgemeine Java-Themen 3
M Umwandlung eines Long-Wertes in einen String Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben