2016-08-02 36 views
1

Ich habe ein serialisiertes Objekt auf der Festplatte eines Patricia-Trie (https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/trie/PatriciaTrie.html). Auf der Festplatte belegt es etwa 7,4 GB. Ich benutze einen 64 GB RAM Server. Bei der Deserialisierung steigt der Speicherverbrauch des entsprechenden Prozesses auf bis zu 40 GB. Ist das sinnvoll, weil die höchste Antwort bei Serialized object size vs in memory object size in Java besagt, dass "die Größe im Speicher in der Regel zwischen der Hälfte und dem Doppelten der serialisierbaren Größe liegt!" Ich habe erwartet, dass die Speichergröße nicht mehr als 15 GB beträgt, aber 40 GB sind zu viel, da auch andere Prozesse geladen werden.Java: riesiger Unterschied in der Größe des serialisierten Java-Objekts und der Speicherbelegung bei der Deserialisierung

Ich dachte an http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html für die Messung der Größe im Speicher, aber Calculate size of Object in Java sagt, dass es "verwendet werden kann, um die Implementierung spezifische Approximation der Objektgröße zu erhalten." Also, es wäre wieder nur ein ungefähres Maß.

Gibt es etwas, das ich hier vermisse? Ich schließe auch die Datei und den gepufferten Reader. Was könnte die ganze Erinnerung an sich reißen? Ich kann den Code aus unternehmenspolitischen Gründen nicht teilen - jegliche Hilfe oder Hinweise wären sehr willkommen. Danke

+1

Was ist mit Ihrem XMX- ist eingestellt? –

+0

Die Größe hängt normalerweise davon ab, um welchen Objekttyp es sich handelt. Das Speicherobjekt enthält Eigenschaften/Felder, die von der Basisklasse geerbt wurden und die nicht serialisiert sind. – user5226582

+0

@JoeriHendrickx Xmx ist auf 60G eingestellt. Der laufende Befehl beginnt mit java -Xmx60g -d64 ... – pandeconscious

Antwort

0

Serialized Größe auf Datenträger hat wenig mit der Größe der Daten im Speicher zu tun. Jedes Objekt in Java hat einen gewissen Speicheraufwand (der je nach JVM-Modus und Version variieren kann). Ein einzelnes Array von Bytes würde serialisiert und auf ungefähr die gleiche Größe/Speicher deserialisiert werden. Ein Array von Milliarden 8-Byte-Arrays würde dies jedoch nicht tun.

Wenn Sie nach dem Deserialisieren der Daten einen Heap-Dump der Daten erstellen, sollten Sie genau feststellen können, wohin der Speicher geht.

How to collect heap dumps of any java process

What is the memory consumption of an object in Java?

Trick behind JVM's compressed Oops