7

たくさんのデータ(オブジェクト)を(計算のために)メモリに保存する必要があります。
計算はこのデータに基づいて行われるため、すべてのデータが同じJVMプロセスメモリに存在することが重要です。
ほとんどのデータは、文字列、整数、およびその他のサブオブジェクト(Collections、HashSetなど)から構築されます。
Javaのオブジェクトのメモリオーバーヘッドは重要であるため(文字列はUTF-16であり、各オブジェクトには8バイトのオーバーヘッドがあります)、このようなデータをより低いオーバーヘッドでメモリに格納できるライブラリを探しています。
メモリの削減に関する興味深い記事を読みました:
* http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf * http://blog.griddynamics.com/2010 / 01 / java-tricks-reducing-memory-consumption.html

そのようなシナリオ用のライブラリがそこにあるのか、それとも最初から始める必要があるのか​​、私はただ疑問に思っていました。
私の要件をよりよく理解するために、大量のレコードを処理し、メモリに保存されている他の何百万ものレコードに基づいてそれらを分析する必要があるサーバーを想像してください(高い処理速度のため)。

4

3 に答える 3

5

コレクションのオーバーヘッドについては、troveを参照してください。それらのメモリ オーバーヘッドは、組み込みのコレクション クラスよりも低くなっています (特に、JDK ではマップに基づくマップとセットの場合)。
大きなオブジェクトがある場合は、それらをコンパクトなバイナリ表現 (Java シリアル化ではなく) として「シリアル化」して保存し、必要に応じて本格的なオブジェクトに逆シリアル化することをお勧めします)
ディスクにページアウトできるキャッシュ ライブラリを使用することもできます。 ? infinispanまたはehcacheを見てください. また、これらのライブラリの一部 (メモリが機能する場合はその中の ehcache) は、jvm プロセスの一部として「オフヒープ ストレージ」を提供します。これは、(ネイティブ) ライブラリによって管理される GC の対象とならないメモリのチャンクです。効率的なバイナリ表現がある場合は、そこに保存できます(フットプリントを下げませんが、GCの動作を改善する可能性があります)

于 2013-01-05T17:15:40.300 に答える
1

String ビットについては、String.getBytes("UTF8") から取得した byte[] を格納できます。String オブジェクトが再度必要な場合は、ByteArray から再度作成できます。もちろん、String オブジェクトを何度も作成するための CPU がいくらか増えるため、サイズと速度の間のトレードオフになります。

于 2013-01-05T17:45:17.143 に答える
0

文字列については、-XX:+UseCompressedStrings jvm オプションも調べてください。ただし、最新の jvm 更新から削除されたようです。この他の質問を参照してください。

于 2013-01-05T17:41:33.983 に答える