1

私はpatricia trie(https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/trie/PatriciaTrie.html)のディスクにシリアル化されたオブジェクトを持っています。ディスク上では、約7.4GBを占めます。私は64 GBのRAMサーバーを使用しています。デシリアライズすると、対応するプロセスのメモリ消費量は40 GBまで増加します。 Serialized object size vs in memory object size in Javaという最高の投票回答は、「メモリ内のサイズは、通常、シリアライズ可能なサイズの2倍から2倍の間になります」と言っているため、これは賢明ですか?私はメモリサイズが15 GBを超えないことを期待していましたが、40 GBはあまりにも多くのプロセスがロードされるほどです。Java:シリアル化されたJavaオブジェクトのサイズとデシリアライズ時のメモリ消費の大きな違い

私はhttp://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.htmlをメモリのサイズ測定に使用すると考えましたが、Calculate size of Object in Javaは「オブジェクトサイズの実装固有の近似を得るために使用できる」と言います。だから、もう一度おおよその目安になるでしょう。

ここには何かがありますか?私はファイルを閉じて、バッファリングされたリーダーも閉じています。すべての記憶を奪うことができますか?私はコーポレート・ポリシー上の理由からコードを共有することはできません。ヘルプや指針は高く評価されます。ありがとう

+1

? –

+0

サイズは通常、オブジェクトの種類によって異なります。メモリオブジェクトには、基本クラスから継承された、シリアル化されていないプロパティ/フィールドが含まれます。 – user5226582

+0

@JoeriHendrickx Xmxは60Gに設定されています。実行コマンドはjava -Xmx60g -d64 ... – pandeconscious

答えて

0

ディスク上のシリアライズされたサイズは、メモリ内のデータのサイズとほとんど関係ありません。 Javaのすべてのオブジェクトにはメモリオーバーヘッドがあります(これはJVMのモードとバージョンによって異なります)。バイトの単一の配列は、ほぼ同じサイズ/メモリにシリアル化され、デシリアライズされていました。しかし、10億個の8バイト配列の配列はそうではありません。

データのデシリアライズ後にデータのヒープダンプを作成する場合、メモリがどこにあるのかを正確に判断できるはずです。あなたのXMXがに設定何

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

関連する問題