1

最近は安価な RAM がたくさんありますが、大量のガベージ コレクションが発生し、望ましくないアプリケーションが停止するため、使用できません。テラコッタを読んでいたとき。テラコッタで余分なメモリを使用し、そのメモリがガベージコレクションにさらされないため、これで問題が解決したと感じました。

私のアプリケーションでは、分散ハッシュマップを作成でき、このハッシュマップに配置したデータはJavaヒープサイズにカウントされませんか? しかし、それはコードの変更を意味します。これは MemCached と同じように見えます。

可能な方法はありますか?既存のアプリにコードを変更せずに (または jmeter のようなサードパーティを使用している場合)、この余分な RAM を使用できるようにするには?

テラコッタでは不可能な場合。他の方法で可能ですか?

4

2 に答える 2

2

をご覧くださいByteBuffer#allocateDirect(int)。ヒープの外側 (したがって、関心のある CG 領域の外側) にバイト バッファー (読み書きできる) を割り当てます。

バックグラウンドで行うことは、 JVM オプションcom.sun.Unsafeの追加チェックを使用して呼び出しを委任することです。-XX:MaxDirectMemorySize-XX:MaxDirectMemorySize、直接割り当てに使用できる直接メモリの量を示します。(デフォルトでは 64MB IIRC です)。

これは、大量の GC を回避するために Ehcache と Terracota が行っていることです。

ただし、これは、アプリケーションを使用するためにアプリケーションを変更する必要がないという意味ではありません。割り当てられたバイト バッファはメモリ内の単なる連続した領域であり、その位置での読み取り/書き込み値以外のインターフェイスがないことに注意してください。したがって、たとえばインターフェイスを介してアクセスできるようにするには、Mapこのマップを自分で実装する必要があります。

于 2012-12-14T11:15:20.573 に答える