.NET の GC.AddMemoryPressure メソッドのように、アンマネージ メモリの割り当てについてランタイムに通知する Java の機能はありますか?
1825 次
2 に答える
2
ダイレクト メモリは Java で個別に管理され、「管理されていない」と見なすことができます。Sun/Oracle JVM では、独自のメモリ使用制限があり、ヒープ サイズと直接メモリ サイズの制限に一度に到達する可能性があります。
Sun/Oracle JVM では、内部 API を使用してダイレクト メモリ ブロックを明示的に解放できます。そうする必要があることはめったにありませんが、その方法は次のとおりです
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024);
((DirectBuffer) bb).cleaner().clean();
GC をトリガーせずに、これを 1 万回実行できます。
ところで: メモリ マップ ファイルは少量のヒープを使用し、直接のメモリ制限にはカウントされません。マップできる量は事実上無制限です。(ただし、1 つの MappedByteBuffer で 2GB に制限されています)
于 2011-09-06T13:41:05.317 に答える
2
これはJavaでは必要ないと思います。「小さなマネージド オブジェクトが大量のアンマネージド メモリを割り当てる場合」は、Java では発生しません。JNI を介してネイティブ (アンマネージド) 関数を呼び出すと、メモリは JVM のマネージド メモリ テーブルに割り当てられません。
参考のため:
于 2011-09-06T12:46:28.663 に答える