So bestimmen Sie die Größe eines Objekts in Java

Lesezeit: 19 Minuten

Benutzeravatar von Jay R
Jay R.

Ich habe eine Anwendung, die eine CSV-Datei mit Stapeln von Datenzeilen liest. Ich gebe dem Benutzer eine Zusammenfassung der Anzahl der Zeilen basierend auf den Datentypen, aber ich möchte sicherstellen, dass ich nicht zu viele Zeilen mit Daten und Ursache einlese OutOfMemoryErrorS. Jede Zeile wird in ein Objekt übersetzt. Gibt es eine Möglichkeit, die Größe dieses Objekts programmgesteuert herauszufinden? Gibt es eine Referenz, die definiert, wie groß primitive Typen und Objektreferenzen für a VM?

Im Moment habe ich Code, der sagt, lesen Sie bis zu 32.000 Zeilenaber ich hätte auch gerne Code, der sagt, dass so viele Zeilen wie möglich gelesen werden, bis ich verwendet habe 32 MB der Erinnerung.

  • Ich habe meinen Agent mit mvn configs hinzugefügt und hier erklärt, wie das geht: stackoverflow.com/a/36102269/711855

    – juanmf

    19. März 2016 um 13:28 Uhr

Benutzeravatar von Stefan Karlsson
Stefan Carlson

Du kannst den … benutzen java.lang.instrument Paket.

Kompilieren Sie diese Klasse und fügen Sie sie in ein JAR ein:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Fügen Sie Folgendes zu Ihrer hinzu MANIFEST.MF:

Premain-Class: ObjectSizeFetcher

Verwenden Sie die getObjectSize() Methode:

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
    }
}

Aufrufen mit:

java -javaagent:ObjectSizeFetcherAgent.jar C

  • @Stefan Schöner Hinweis! Können Sie bitte sagen, welche Größe es haben wird? byte[0], byte[1], byte[5], int[0], int[1], int[2] mit der von Ihnen beschriebenen Vorgehensweise? Es wäre schön, wenn die Ergebnisse Overhead für die Länge des Arrays und die Speicherausrichtung enthalten würden.

    – dma_k

    8. März 2010 um 11:28 Uhr

  • Ich habe dies versucht und bekam seltsame und nicht hilfreiche Ergebnisse. Saiten waren immer 32, unabhängig von der Größe. Ich dachte, das wäre vielleicht die Zeigergröße, aber für eine andere unveränderliche Klasse, die ich erstellt habe, habe ich 24 bekommen. Es funktioniert gut für Primitive, aber dann brauchen Sie nicht wirklich ein Programm, um Ihnen zu sagen, wie groß ein Zeichen ist.

    – Brel

    16. September 2011 um 12:39 Uhr

  • @Brel Diese Lösung ist nur eine “Annäherung an die vom angegebenen Objekt verbrauchte Speichermenge”, wie in der Dokumentation angegeben. Ich nehme auch an, dass die Autoren beschlossen haben, die Größe eines Strings auf 32 Bytes (nur den Zeiger?) Wegen des String-Pools von Java festzulegen, was es schwierig macht zu sagen, ob eine String-Instanz gemeinsam genutzt (im Pool gespeichert) oder lokal&einzigartig für eine Klasse.

    – VG

    17. Juli 2013 um 8:33 Uhr


  • Wie kann ich ObjectSizeFetcher verwenden, wenn JAR nicht exportiert wird? Ich habe ein Test-Java-Projekt in Eclipse.

    – Yura Shinkarev

    5. August 2013 um 18:40 Uhr

  • @brel Der Grund, warum ein String unabhängig von der tatsächlichen Länge nur 32 Bytes groß ist, liegt darin, dass der Teil einer Zeichenfolge mit variabler Länge in einem Zeichen gespeichert wird[], was ein eigenes Objekt ist. Um die wahre Größe eines Objekts zu erhalten, müssen Sie die Größe von sich selbst und die Größe jedes Objekts, auf das es verweist, addieren.

    – Tombrown52

    31. Mai 2018 um 16:05 Uhr

Du solltest benutzen Spaßein Tool, das im Rahmen des OpenJDK-Projekts entwickelt wurde.

JOL (Java Object Layout) ist die winzige Toolbox zur Analyse von Objekt-Layout-Schemata in JVMs. Diese Tools verwenden Unsafe, JVMTI und Serviceability Agent (SA) stark, um das tatsächliche Objektlayout, den Footprint und die Referenzen zu decodieren. Dadurch ist JOL viel genauer als andere Tools, die auf Heap-Dumps, Spezifikationsannahmen usw.

Um die Größen von Primitives, Referenzen und Array-Elementen zu erhalten, verwenden Sie VMSupport.vmDetails(). Auf Oracle JDK 1.8.0_40, das auf 64-Bit-Windows ausgeführt wird (wird für alle folgenden Beispiele verwendet), gibt diese Methode zurück

Running 64-bit HotSpot VM.
Using compressed oop with 0-bit shift.
Using compressed klass with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

Sie können die geringe Größe einer Objektinstanz mit abrufen ClassLayout.parseClass(Foo.class).toPrintable() (optional Übergabe einer Instanz an toPrintable). Dies ist nur der Speicherplatz, der von einer einzelnen Instanz dieser Klasse verbraucht wird; es enthält keine anderen Objekte, auf die von dieser Klasse verwiesen wird. Es tut VM-Overhead für den Objekt-Header, die Feldausrichtung und das Padding einbeziehen. Für java.util.regex.Pattern:

java.util.regex.Pattern object internals:
 OFFSET  SIZE        TYPE DESCRIPTION                    VALUE
      0     4             (object header)                01 00 00 00 (0000 0001 0000 0000 0000 0000 0000 0000)
      4     4             (object header)                00 00 00 00 (0000 0000 0000 0000 0000 0000 0000 0000)
      8     4             (object header)                cb cf 00 20 (1100 1011 1100 1111 0000 0000 0010 0000)
     12     4         int Pattern.flags                  0
     16     4         int Pattern.capturingGroupCount    1
     20     4         int Pattern.localCount             0
     24     4         int Pattern.cursor                 48
     28     4         int Pattern.patternLength          0
     32     1     boolean Pattern.compiled               true
     33     1     boolean Pattern.hasSupplementary       false
     34     2             (alignment/padding gap)        N/A
     36     4      String Pattern.pattern                (object)
     40     4      String Pattern.normalizedPattern      (object)
     44     4        Node Pattern.root                   (object)
     48     4        Node Pattern.matchRoot              (object)
     52     4       int[] Pattern.buffer                 null
     56     4         Map Pattern.namedGroups            null
     60     4 GroupHead[] Pattern.groupNodes             null
     64     4       int[] Pattern.temp                   null
     68     4             (loss due to the next object alignment)
Instance size: 72 bytes (reported by Instrumentation API)
Space losses: 2 bytes internal + 4 bytes external = 6 bytes total

Sie können eine zusammenfassende Ansicht der tiefen Größe einer Objektinstanz erhalten, indem Sie verwenden GraphLayout.parseInstance(obj).toFootprint(). Natürlich können einige Objekte im Footprint gemeinsam genutzt werden (auch von anderen Objekten referenziert werden), sodass es sich um eine Überschätzung des Speicherplatzes handelt, der zurückgewonnen werden könnte, wenn dieses Objekt durch Garbage Collection erfasst wird. Für das Ergebnis von Pattern.compile("^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$") (aus dieser Antwort entnommen) meldet jol einen Gesamtspeicherbedarf von 1840 Bytes, von denen nur 72 die Pattern-Instanz selbst sind.

java.util.regex.Pattern instance footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1       112       112   [C
         3       272       816   [Z
         1        24        24   java.lang.String
         1        72        72   java.util.regex.Pattern
         9        24       216   java.util.regex.Pattern$1
        13        24       312   java.util.regex.Pattern$5
         1        16        16   java.util.regex.Pattern$Begin
         3        24        72   java.util.regex.Pattern$BitClass
         3        32        96   java.util.regex.Pattern$Curly
         1        24        24   java.util.regex.Pattern$Dollar
         1        16        16   java.util.regex.Pattern$LastNode
         1        16        16   java.util.regex.Pattern$Node
         2        24        48   java.util.regex.Pattern$Single
        40                1840   (total)

Wenn Sie stattdessen verwenden GraphLayout.parseInstance(obj).toPrintable(), jol teilt Ihnen Adresse, Größe, Typ, Wert und Pfad der Felddereferenzen zu jedem referenzierten Objekt mit, obwohl das normalerweise zu detailliert ist, um nützlich zu sein. Für das fortlaufende Musterbeispiel erhalten Sie möglicherweise Folgendes. (Die Adressen ändern sich wahrscheinlich zwischen den Läufen.)

java.util.regex.Pattern object externals:
          ADDRESS       SIZE TYPE                             PATH                           VALUE
         d5e5f290         16 java.util.regex.Pattern$Node     .root.next.atom.next           (object)
         d5e5f2a0        120 (something else)                 (somewhere else)               (something else)
         d5e5f318         16 java.util.regex.Pattern$LastNode .root.next.next.next.next.next.next.next (object)
         d5e5f328      21664 (something else)                 (somewhere else)               (something else)
         d5e647c8         24 java.lang.String                 .pattern                       (object)
         d5e647e0        112 [C                               .pattern.value                 [^, [, a, -, z, A, -, Z, 0, -, 9, _, ., +, -, ], +, @, [, a, -, z, A, -, Z, 0, -, 9, -, ], +, \, ., [, a, -, z, A, -, Z, 0, -, 9, -, ., ], +, $]
         d5e64850        448 (something else)                 (somewhere else)               (something else)
         d5e64a10         72 java.util.regex.Pattern                                         (object)
         d5e64a58        416 (something else)                 (somewhere else)               (something else)
         d5e64bf8         16 java.util.regex.Pattern$Begin    .root                          (object)
         d5e64c08         24 java.util.regex.Pattern$BitClass .root.next.atom.val$rhs        (object)
         d5e64c20        272 [Z                               .root.next.atom.val$rhs.bits   [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
         d5e64d30         24 java.util.regex.Pattern$1        .root.next.atom.val$lhs.val$lhs.val$lhs.val$lhs.val$lhs.val$lhs (object)
         d5e64d48         24 java.util.regex.Pattern$1        .root.next.atom.val$lhs.val$lhs.val$lhs.val$lhs.val$lhs.val$rhs (object)
         d5e64d60         24 java.util.regex.Pattern$5        .root.next.atom.val$lhs.val$lhs.val$lhs.val$lhs.val$lhs (object)
         d5e64d78         24 java.util.regex.Pattern$1        .root.next.atom.val$lhs.val$lhs.val$lhs.val$lhs.val$rhs (object)
         d5e64d90         24 java.util.regex.Pattern$5        .root.next.atom.val$lhs.val$lhs.val$lhs.val$lhs (object)
         d5e64da8         24 java.util.regex.Pattern$5        .root.next.atom.val$lhs.val$lhs.val$lhs (object)
         d5e64dc0         24 java.util.regex.Pattern$5        .root.next.atom.val$lhs.val$lhs (object)
         d5e64dd8         24 java.util.regex.Pattern$5        .root.next.atom.val$lhs        (object)
         d5e64df0         24 java.util.regex.Pattern$5        .root.next.atom                (object)
         d5e64e08         32 java.util.regex.Pattern$Curly    .root.next                     (object)
         d5e64e28         24 java.util.regex.Pattern$Single   .root.next.next                (object)
         d5e64e40         24 java.util.regex.Pattern$BitClass .root.next.next.next.atom.val$rhs (object)
         d5e64e58        272 [Z                               .root.next.next.next.atom.val$rhs.bits [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
         d5e64f68         24 java.util.regex.Pattern$1        .root.next.next.next.atom.val$lhs.val$lhs.val$lhs (object)
         d5e64f80         24 java.util.regex.Pattern$1        .root.next.next.next.atom.val$lhs.val$lhs.val$rhs (object)
         d5e64f98         24 java.util.regex.Pattern$5        .root.next.next.next.atom.val$lhs.val$lhs (object)
         d5e64fb0         24 java.util.regex.Pattern$1        .root.next.next.next.atom.val$lhs.val$rhs (object)
         d5e64fc8         24 java.util.regex.Pattern$5        .root.next.next.next.atom.val$lhs (object)
         d5e64fe0         24 java.util.regex.Pattern$5        .root.next.next.next.atom      (object)
         d5e64ff8         32 java.util.regex.Pattern$Curly    .root.next.next.next           (object)
         d5e65018         24 java.util.regex.Pattern$Single   .root.next.next.next.next      (object)
         d5e65030         24 java.util.regex.Pattern$BitClass .root.next.next.next.next.next.atom.val$rhs (object)
         d5e65048        272 [Z                               .root.next.next.next.next.next.atom.val$rhs.bits [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
         d5e65158         24 java.util.regex.Pattern$1        .root.next.next.next.next.next.atom.val$lhs.val$lhs.val$lhs.val$lhs (object)
         d5e65170         24 java.util.regex.Pattern$1        .root.next.next.next.next.next.atom.val$lhs.val$lhs.val$lhs.val$rhs (object)
         d5e65188         24 java.util.regex.Pattern$5        .root.next.next.next.next.next.atom.val$lhs.val$lhs.val$lhs (object)
         d5e651a0         24 java.util.regex.Pattern$1        .root.next.next.next.next.next.atom.val$lhs.val$lhs.val$rhs (object)
         d5e651b8         24 java.util.regex.Pattern$5        .root.next.next.next.next.next.atom.val$lhs.val$lhs (object)
         d5e651d0         24 java.util.regex.Pattern$5        .root.next.next.next.next.next.atom.val$lhs (object)
         d5e651e8         24 java.util.regex.Pattern$5        .root.next.next.next.next.next.atom (object)
         d5e65200         32 java.util.regex.Pattern$Curly    .root.next.next.next.next.next (object)
         d5e65220        120 (something else)                 (somewhere else)               (something else)
         d5e65298         24 java.util.regex.Pattern$Dollar   .root.next.next.next.next.next.next (object)

Die “(etwas anderes)”-Einträge beschreiben andere Objekte im Heap, die nicht Teil dieses Objektgraphen sind.

Die beste Jol-Dokumentation ist die lustige Proben im Jol-Repository. Die Beispiele veranschaulichen allgemeine Jol-Operationen und zeigen, wie Sie Jol verwenden können, um VM- und Garbage-Collector-Interna zu analysieren.

  • Diese Antwort sollte mehr Upvotes haben. Auf jeden Fall eine sehr gute Option zum Überprüfen. BEARBEITEN: Überprüft, ob dies dieses Jahr hinzugefügt wurde, während die Frage ’08 gestellt wurde. Wahrscheinlich die beste und einfachste Option, um das zu tun, was OP im Moment verlangt.

    – Mieten

    30. August 2015 um 19:22 Uhr


  • Der Tool-Autor schrieb ein Blogbeitrag über Jol.

    – Mike

    6. September 2015 um 0:37 Uhr

  • Um die Größe des Objekts „obj“ zu bestimmen, verwenden Sie: org.openjdk.jol.info.GraphLayout.parseInstance(obj).totalSize();

    – Kraft

    19. Januar 2017 um 9:26 Uhr


  • Beachten Sie, dass vmDetails ist jetzt VM.current().details().

    – Miha_x64

    13. Mai 2018 um 7:35 Uhr

  • Kasse GraphLayout.parseInstance(instance).toFootprint() Ich fand es nützlicher, Objektgrößen zu verstehen

    – Mugen

    2. April 2020 um 8:37 Uhr

Ich habe versehentlich eine Java-Klasse “jdk.nashorn.internal.ir.debug.ObjectSizeCalculator” bereits in jdk gefunden, die einfach zu verwenden ist und für die Bestimmung der Größe eines Objekts recht nützlich erscheint.

System.out.println(ObjectSizeCalculator.getObjectSize(new gnu.trove.map.hash.TObjectIntHashMap<String>(12000, 0.6f, -1)));
System.out.println(ObjectSizeCalculator.getObjectSize(new HashMap<String, Integer>(100000)));
System.out.println(ObjectSizeCalculator.getObjectSize(3));
System.out.println(ObjectSizeCalculator.getObjectSize(new int[]{1, 2, 3, 4, 5, 6, 7 }));
System.out.println(ObjectSizeCalculator.getObjectSize(new int[100]));

Ergebnisse:

164192
48
16
48
416

  • Auch hier habe ich die anderen oben vorgeschlagenen Lösungen ausprobiert und bin auf ObjectSizeCalculator gestoßen. Ich glaube, niemand hat dies zuvor erwähnt, da es kürzlich im Rahmen des Projekts auf dem JDK 8 eingeführt wurde Nasshorn. Ich habe jedoch keine offizielle Dokumentation zu dieser Klasse im Internet gefunden.

    – Henrique Gontijo

    16. Oktober 2016 um 18:26 Uhr


  • Es scheint die Saitenlängen nicht zu berücksichtigen. Geht es nur um die Größe auf dem Stack?

    – jontejj

    7. Mai 2017 um 8:50 Uhr

  • Ich habe eine Hashmap, in der com.carrotsearch.RamUsageEstimator etwa die Hälfte von ObjectSizeCalculator zurückgibt. Welches ist wahr? – Welches ist zuverlässiger?

    – badera

    18. Mai 2017 um 8:36 Uhr

  • Beachten Sie, dass ObjectSizeCalculator wird nur auf HotSpot VM unterstützt

    – kellanburket

    2. Februar 2018 um 21:04 Uhr


  • Auch jdk.nashorn.internal.ir.debug.ObjectSizeCalculator ist in JDK 11 nicht mehr vorhanden

    – Martin Wysny

    23. Oktober 2020 um 8:55 Uhr

Benutzeravatar von Boris Terzic
Boris Terzic

Vor einigen Jahren hatte Javaworld ein Artikel über die Bestimmung der Größe zusammengesetzter und potenziell verschachtelter Java-Objekte, gehen sie im Grunde durch die Erstellung einer sizeof() -Implementierung in Java. Der Ansatz baut im Wesentlichen auf anderen Arbeiten auf, bei denen Menschen experimentell die Größe von Primitiven und typischen Java-Objekten identifizierten und dieses Wissen dann auf eine Methode anwendeten, die rekursiv einen Objektgraphen durchläuft, um die Gesamtgröße zu ermitteln.

Es wird immer etwas weniger genau sein als eine native C-Implementierung, einfach wegen der Dinge, die hinter den Kulissen einer Klasse vor sich gehen, aber es sollte ein guter Indikator sein.

Alternativ ein entsprechend genanntes SourceForge-Projekt Größe von das eine Java5-Bibliothek mit einer sizeof()-Implementierung anbietet.

PS Verwenden Sie nicht den Serialisierungsansatz, es besteht keine Korrelation zwischen der Größe eines serialisierten Objekts und der Menge an Speicher, die es verbraucht, wenn es live ist.

Benutzeravatar von Nick Fortescue
Nick Fortescue

Erstens ist “die Größe eines Objekts” kein klar definiertes Konzept in Java. Sie könnten das Objekt selbst meinen, nur mit seinen Mitgliedern, dem Objekt und allen Objekten, auf die es sich bezieht (der Referenzgraph). Sie könnten die Größe im Arbeitsspeicher oder die Größe auf der Festplatte meinen. Und die JVM darf Dinge wie Strings optimieren.

Der einzig richtige Weg ist also, die JVM mit einem guten Profiler zu fragen (ich verwende DeinKit), was wahrscheinlich nicht das ist, was Sie wollen.

Aus der obigen Beschreibung geht jedoch hervor, dass jede Zeile in sich abgeschlossen ist und keinen großen Abhängigkeitsbaum hat, sodass die Serialisierungsmethode wahrscheinlich eine gute Annäherung an die meisten JVMs darstellt. Der einfachste Weg, dies zu tun, ist wie folgt:

 Serializable ser;
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(baos);
 oos.writeObject(ser);
 oos.close();
 return baos.size();

Denken Sie daran, wenn Sie Objekte mit gemeinsamen Referenzen haben wird nicht geben das richtige Ergebnis, und die Größe der Serialisierung stimmt nicht immer mit der Größe im Speicher überein, aber es ist eine gute Annäherung. Der Code wird etwas effizienter, wenn Sie die ByteArrayOutputStream-Größe auf einen vernünftigen Wert initialisieren.

  • Ich mag diesen Ansatz. Wie weit waren Sie in Bezug auf die Objektgröße davon entfernt?

    – Berliner Braun

    24. Juli 2009 um 17:56 Uhr

  • Sehr einfach und effektiv. Andere Methoden sind zu chaotisch (insbesondere innerhalb von Eclipse RCP). Danke.

    – Marcolopes

    24. April 2012 um 16:18 Uhr

  • Die Serialisierung verfolgt keine transienten Variablen, und die standardmäßige Serialisierungsmethode schreibt Zeichenfolgen in UTF-8, sodass alle ANSI-Zeichen nur ein Byte benötigen. Wenn Sie viele Saiten haben, ist Ihre Größe so weit entfernt, dass sie unbrauchbar ist.

    – TMN

    9. Juli 2012 um 18:45 Uhr

  • Während dies möglicherweise nicht die genaue Größe angibt, benötigte ich für meine Bedürfnisse nur einen Vergleich zwischen 2 Objekten und SizeOf wird nicht von einer Web-App initialisiert. Danke!

    – Isaak

    30. Oktober 2012 um 22:57 Uhr

  • Gute Empfehlung von DeinKit. Andere Alternativen sind Virtuelle VM Und jvmmonitor

    – angelcervera

    24. Februar 2013 um 10:46 Uhr

Benutzeravatar von Yuval
Yuval

Wenn Sie nur wissen möchten, wie viel Speicher in Ihrer JVM verwendet wird und wie viel frei ist, können Sie Folgendes versuchen:

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

Bearbeiten: Ich dachte, dies könnte hilfreich sein, da der Autor der Frage auch erklärte, er hätte gerne eine Logik, die “so viele Zeilen wie möglich liest, bis ich 32 MB Speicher verwendet habe”.

  • Ich mag diesen Ansatz. Wie weit waren Sie in Bezug auf die Objektgröße davon entfernt?

    – Berliner Braun

    24. Juli 2009 um 17:56 Uhr

  • Sehr einfach und effektiv. Andere Methoden sind zu chaotisch (insbesondere innerhalb von Eclipse RCP). Danke.

    – Marcolopes

    24. April 2012 um 16:18 Uhr

  • Die Serialisierung verfolgt keine transienten Variablen, und die standardmäßige Serialisierungsmethode schreibt Zeichenfolgen in UTF-8, sodass alle ANSI-Zeichen nur ein Byte benötigen. Wenn Sie viele Saiten haben, ist Ihre Größe so weit entfernt, dass sie unbrauchbar ist.

    – TMN

    9. Juli 2012 um 18:45 Uhr

  • Während dies möglicherweise nicht die genaue Größe angibt, benötigte ich für meine Bedürfnisse nur einen Vergleich zwischen 2 Objekten und SizeOf wird nicht von einer Web-App initialisiert. Danke!

    – Isaak

    30. Oktober 2012 um 22:57 Uhr

  • Gute Empfehlung von DeinKit. Andere Alternativen sind Virtuelle VM Und jvmmonitor

    – angelcervera

    24. Februar 2013 um 10:46 Uhr

Benutzeravatar von Attila Szegedi
Attila Szegedi

Damals, als ich bei Twitter arbeitete, schrieb ich ein Dienstprogramm zur Berechnung der Größe tiefer Objekte. Es berücksichtigt verschiedene Speichermodelle (32-Bit, komprimierte Oops, 64-Bit), Padding, Subclass Padding, funktioniert korrekt bei kreisförmigen Datenstrukturen und Arrays. Sie können einfach diese eine .java-Datei kompilieren; es hat keine externen Abhängigkeiten:

https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/objectsize/ObjectSizeCalculator.java

  • Szia! Ich möchte nur Ihre schreien Präsentation auch: Die Folien 15-20 sind großartig, um ein instinktives Gefühl für die Kosten verschiedener Datenstrukturentscheidungen zu bekommen. Danke, dass du das gepostet hast!

    – Lukas Usherwood

    1. Oktober 2015 um 1:58 Uhr


  • “es hat keine externen Abhängigkeiten” – seit wann ist Guave keine externe Abhängigkeit?

    – l4mpi

    11. Januar 2016 um 14:21 Uhr

  • sieht sehr ähnlich aus github.com/JetBrains/jdk8u_nashorn/blob/master/src/jdk/nashorn/… ? :Ö

    – Francesco

    24. Oktober 2017 um 14:02 Uhr


  • Guave ist eine externe Abhängigkeit.

    – Mert Serimer

    14. Dezember 2017 um 10:33 Uhr

  • Diese Lösung funktioniert nicht, wenn OpenJDK 17 verwendet wird

    – Moritz

    23. Februar 2022 um 1:58 Uhr

1445140cookie-checkSo bestimmen Sie die Größe eines Objekts in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy