JDKは、メモリーがJavaヒープの外部に割り振られる、いわゆるダイレクトByteBuffersを割り当てる能力を提供します。このメモリはガベージコレクタには触れられておらず、GCオーバーヘッドには寄与しないので、これは有益です。これは、キャッシュなどのロングライフのプロパティにとって非常に便利です。ネイティブメモリを強制的に解放する例ByteBufferは、sun.misc.Unsafeを使用して割り当てましたか?
ただし、既存の実装には重大な問題が1つあります。基底のメモリは、所有しているByteBufferがガベージコレクションされている場合にのみ非同期に割り当てられます。早期解放を強制する方法はありません。これは、GCサイクル自体がByteBuffersの処理の影響を受けず、ByteBufferが旧世代のメモリ領域に存在する可能性が高いため、ByteBufferが使用されなくなってから数時間後にGCが呼び出される可能性があるため、問題があります。
しかし理論的にはsun.misc.Unsafe
のメソッド(freeMemory、allocateMemory)を直接使用することができます.JDK自体がネイティブメモリの割り当て/割り当て解除に使用するものです。 コードを見ると、私が目にする潜在的な懸念の1つは、メモリの二重解放の可能性です。そのため、状態が適切に浄化されるようにしたいと考えています。
誰も私にこれを行うコードを教えてもらえますか? JNAの代わりにこれを使用するのが理想的です。
注:私はthis questionを見ましたが、これは関連しています。
指摘されている答えが良い方法であるように見えます。hereは、アイデアを使用したElastic Searchのコード例です。みんなありがとう!
これは何年も前のことですが、今見ています。 (過去に私はちょうど私のケースでは圧力を低く保っていたバッファーの循環キューを使用していました) –
うわー、私はどこでも良い記事を見つけることができません:( –
私はSystem.gcとにかくターゲットと思われるSun上では少なくとも無視されます – nilskp