Untersuchen Sie die Speichernutzung von Java-Elementen

Primitive und Box

Zunächst möchte ich ein Array von Grundelementen und Box-Typen erstellen und sehen, wie viel Speicher verwendet wird.

  private static final int NUM = 100_000;

  public static void main(String[] args) {
    long beforeUse, afterUse, div;
    beforeUse = memoryUsed();
    int[] primitive = new int[NUM];
    afterUse = memoryUsed();
    div = afterUse - beforeUse;

    out.println(" -- int[] -- ");
    out.println(div);
    out.println((double)div / primitive.length);

    beforeUse = memoryUsed();
    Integer[] classes = new Integer[NUM];
    afterUse = memoryUsed();
    div = afterUse - beforeUse;

    out.println(" -- Integer[] unset -- ");
    out.println(div);
    out.println((double)div / classes.length);

    for (int i = 0;i < classes.length;i++) {
      classes[i] = i;
    }

    afterUse = memoryUsed();
    div = afterUse - beforeUse;

    out.println(" -- Integer[] set -- ");
    out.println(div);
    out.println((double)div / classes.length);
  }

Ausführungsergebnis

 -- boolean[] -- 
100016
1.00016
 -- Boolean[] unset -- 
400016
4.00016
 -- Boolean[] set -- 
400016
4.00016
 -- byte[] -- 
100016
1.00016
 -- Byte[] unset -- 
400016
4.00016
 -- Byte[] set -- 
448528
4.48528
 -- short[] -- 
200016
2.00016
 -- Short[] unset -- 
400016
4.00016
 -- Short[] set -- 
1923440
19.2344
 -- char[] -- 
200016
2.00016
 -- Character[] unset -- 
400016
4.00016
 -- Character[] set -- 
2402512
24.02512
 -- int[] -- 
400016
4.00016
 -- Integer[] unset -- 
400016
4.00016
 -- Integer[] set -- 
2202512
22.02512
 -- long[] -- 
1048576
10.48576
 -- Long[] unset -- 
400016
4.00016
 -- Long[] set -- 
3105872
31.05872
 -- float[] -- 
400016
4.00016
 -- Float[] unset -- 
400016
4.00016
 -- Float[] set -- 
2706352
27.06352
 -- double[] -- 
1048576
10.48576
 -- Double[] unset -- 
400016
4.00016
 -- Double[] set -- 
3651112
36.51112

Speichernutzung pro Element [Bytes]

Schimmel Primitive BoxSchimmel(unset) BoxSchimmel(set)
boolean / Boolean 1.00 4.00 4.00
byte / Byte 1.00 4.00 4.48
short / Short 2.00 4.00 19.23
char / Character 2.00 4.00 24.03
int / Integer 4.00 4.00 27.06
long / Long 10.49 4.00 36.51
float / Float 4.00 4.00 27.06
double / Double 10.49 4.00 31.06

Wenn ich ein Array erstelle, verwende ich immer 16 Bytes. Ich bin nicht sicher, ob die Grundelemente mehr Speicher beanspruchten als lange und doppelt erwartet. Ist es strengstens verboten, es häufig zu verwenden, da es sich um einen Box-Typ (Satz) handelt und nach Zeichen 20 Byte oder mehr verwendet?

String-Klasse

Werfen wir einen Blick auf die Speichernutzung der String-Klasse.

// set empty
for (int i = 0;i < NUM;i++) {
    ary[i] = "";
}
// set new String
for (int i = 0;i < NUM;i++) {
    ary[i] = new String();
}

// set 10digit
for (int i = 0;i < NUM;i++) {
    ary[i] = new String("0123456789");
}
 -- String[] unset -- 
400016
4.00016
 -- String[] set empty -- 
400016
4.00016
 -- String[] set new String -- 
3105872
31.05872
 -- String[] set 10digit -- 
3105872
31.05872

New String für alle Elemente verbraucht ungefähr 31 Bytes. Es ist jedoch seltsam, dass sogar "neuer String (" 0123456789 ")" 31 Bytes beträgt. Liegt es daran, dass das interne Element private final byte [] value; immer dieselbe Referenz ist?

Also habe ich es so korrigiert, dass alle Elemente einzigartig sind.

for (int i = 0;i < NUM;i++) {
    ary[i] = String.format("%010d", i);
}
System.gc();
 -- String[] set 10digit -- 
4998968
49.98968

Es wurden 49 Bytes pro Element.

HashMap

Fügen Sie 100.000 Elemente in HashMap ein.

Map<String, String> map = new HashMap<>();
for (int i = 0;i < NUM;i++) {
    map.put(String.valueOf(i), "A" + i);
}
13632176
136.32176

Es wurden 136 Bytes pro Element. Es scheint, dass Sie es lesen müssen, weil Sie die Gründe nur verstehen können, wenn Sie sich die Implementierung ansehen.

Quellcode

Recommended Posts

Untersuchen Sie die Speichernutzung von Java-Elementen
Vergleichen Sie Elemente eines Arrays (Java)
[Java] Mirage-Basic-Verwendung von SQL
Untersuchen Sie die Grenzen der "32 GB Speicherwand" in Elasticsearch
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
[Java] Versuchen Sie, die Elemente der Json-Zeichenfolge mithilfe der Bibliothek zu bearbeiten
[Java Edition] Geschichte der Serialisierung
Grundlegende Verwendung von Java Optionaler Teil 1
Die Geschichte von @ViewScoped, die Speicher verschlingt
Messen des Instanznutzungsspeichers in Java
Der Ursprung von Java-Lambda-Ausdrücken
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
Untersuchen Sie die Liste der Zeitzonen-IDs, die in der Java ZoneId-Klasse verfügbar sind
Holen Sie sich das Ergebnis von POST in Java
[Java] Ermittelt den Tag eines bestimmten Tages
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Was sind die aktualisierten Funktionen von Java 13
Messen Sie einfach die Größe von Java-Objekten
Rückblick auf die Grundlagen von Java
Ausgabe des Buches "Einführung in Java"
Speichermessung von Java-Apps unter Windows
Die Geschichte des Schreibens von Java in Emacs
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] [Spring] Testen Sie das Verhalten des Loggers
Referenzinformationen zur Untersuchung und Analyse des Speichernutzungsstatus von Tomcat
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
JAVA: jar, aar, zeige den Inhalt der Datei an
Die Geschichte eines gewöhnlichen Othello in Java
[Android] [Java] Verwalten Sie den Status der CheckBox von ListView
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
Über die Idee anonymer Klassen in Java
[Java-Entwicklung] Java-Speicher
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
[Java] Zugriff auf die signierte URL von s3 (signierte Version 2)
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
[Java] Ermittelt die Länge der Ersatzpaarzeichenfolge
[Java] Der verwirrende Teil von String und StringBuilder
[Hinweis] Java: Messen Sie die Geschwindigkeit der Zeichenfolgenverkettung
Ich habe die Eigenschaften von Java und .NET verglichen
[Java] Achten Sie auf den Schlüsseltyp der Karte
Spüren Sie den Lauf der Zeit auch in Java
Java Nr. 3 für die Stream-Speichernutzung, die für Unternehmen nützlich ist
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
Probieren Sie Progate Free Edition [Java II]
Lernen Sie den rudimentären Mechanismus und die Verwendung von Gradle 4.4 kennen
[Java / Kotlin] Ändern Sie die Größe unter Berücksichtigung der Ausrichtung des Bildes
Das Datum und die Uhrzeit von java8 wurden aktualisiert
Importieren Sie Dateien derselben Hierarchie in Java
[Java] Übersicht über Java
Java-Überprüfung ③ (grundlegende Verwendung von Arrays / Referenztyp)
Erster Touch der Files-Klasse (oder Java 8)
Java Willkommen im Sumpf der zweidimensionalen Arrays
Probieren Sie Progate Free Edition [Java I]
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab
[Java] Sortieren Sie ArrayList nach Elementen Ihrer eigenen Klasse