2014-09-01 3 views
5

Wie effektiv die Größe eines Date-Objekt in meinem Gedächtnis bestimmen?Java ‚Datum‘ Objektgröße

Zunächst ging ich diese link durch die etwa 9 Byte für ein Date Objekt spricht ..

ich versuche, es herauszufinden, wann ich diesen Link gefunden, wo es über 32 Bytes spricht !!! ! für ein Datumsobjekt im Speicher.

Date Object Size in Memory

Mit freundlicher Hilfe.

Grund für das Denken in diesen Zeilen: Ich lade Millionen von Objekten einer bestimmten Klasse in den Speicher, für einige Berechnungen. Eine der Variablen in dieser Klasse ist ein Date-Objekt. Ich kann den Wert als Long speichern, aber das würde kleinere Macken im Code erfordern. Ich denke darüber nach, den Speicherbedarf so gering wie möglich zu halten. Dazu muss ich die genauen Speicheranforderungen in jedem Fall kennen, um einen Anruf auf dem gleichen zu nehmen.

+6

Vielleicht erklären Sie das Problem, dass Sie kümmern müssen? – John3136

+2

Verbrauch im Heap-Raum! = Serialisierte Größe, http://StackOverflow.com/Questions/258120/what-is-the-Memory-Consumption-of-an-Object-in-Java – jdphenix

+0

@ John3136 Hinzugefügt das gleiche. Vielen Dank. – LPD

Antwort

2

Ihr erster Link spricht über die Größe, wenn serialisiert, sind Sie über die Größe im Speicher zu sprechen. Deshalb sind die Größen unterschiedlich.

Serialized, wie pro Ihren Link, 9 Byte für das gespeicherte lang.

In Speicher, wie pro Ihre zweite Verbindung, 32 Bytes für die langen und andere Objekte, die es Ihnen ermöglichen, mit dem Datum zu arbeiten.

0

Es hängt von der jeweiligen Implementierung, was Sie mit ihm zu tun beabsichtigen und wie Sie definieren und die Größe messen. Zum Beispiel

public static void main(String[] args) { 
    Date d = new Date(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    try (ObjectOutputStream oos = new ObjectOutputStream(baos);) { 
     oos.writeObject(d); 
     oos.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    byte[] written = baos.toByteArray(); 
    System.out.println(written.length); 
} 

Ausgänge

46 

hier.

bearbeiten

die primitive long Mit immer weniger Speicher verwenden Sie dann eine beliebige Objekttyp (Date enthalten). Das ist der Grund, warum Java Primitive enthält. Wenn Sie schließlich eine Instanz von Calendar verwenden und die Werte als long beibehalten, sollten Sie die Flexibilität haben, Ihre Codeänderungen zu minimieren.

2

Der einfachste Weg, diese Frage zu beantworten ist auf den Quellcode von java.util.Date zu suchen.

Es hat nur 2 nicht-statische Felder (Java 1.7.0_55):

private transient long fastTime; 
private transient BaseCalendar.Date cdate; 

long eine Speichergröße von 8 Byte hat und cdate ist eine Objektreferenz, die eine Größe von 4 Bytes hat. Also insgesamt 12 Bytes.

Wenn cdate würde instanziert werden, könnte es zusätzliche Bytes im Speicher erfordern, aber wenn man sich den Konstrukteuren zu sehen, manchmal wird es nicht einmal berührt werden, und in anderen wird es null am Ende -ed sein der Konstruktor, so ist das Endergebnis auch 12 Bytes.

Dies ist nur zum Erstellen einer Date. Wenn Sie Methoden auf der Date (zum Beispiel Date.toString()) aufrufen, wird erstellen und speichern Sie ein Objekt in das Feld cdate, die nicht gelöscht werden. Wenn Sie also bestimmte Methoden auf Date aufrufen, wird die Speichernutzung erhöht.

Hinweis: Objektverweise könnten in 64-Bit-JVMs 64 Bit lang sein. In diesem Fall wäre die Speicherbelegung 16 Byte.

Hinweis # 2: Beachten Sie auch, dass dies nur die Speichernutzung des Objekts Date selbst ist. Höchstwahrscheinlich werden Sie seine Referenz irgendwo speichern, z. in einem Array oder einer Liste oder einem Feld in einer anderen Klasse, die zusätzliche 4 Bytes benötigt (oder vielleicht 8 Bytes auf 64-Bit-JVMs).

+0

Welche Version der Java-Quelle hast du angeschaut? –

+0

@LuiggiMendoza Java 1.7.0_55. – icza