5

スクラッチスペース用の一時バッファが必要なCライブラリがあります。ダイレクトバイトバッファのアドレスを渡すことを考えています。

  • VMは、最終的に解放される前にバッファーを再配置することを許可されていますか?JNIフレームがなくなると、ネイティブライブラリはポインタを保持します。私の理解では、VMがGC中にそれらを再配置する可能性があるため、JNIローカルオブジェクト参照をキャッシュすることはできません。これはバッファアドレスに適用されますか?

  • Javaでバッファを割り当ててから、バッファオブジェクトをスコープ外にすると、VMがバッファメモリを解放することを理解しています。NewDirectByteBufferを使用してネイティブコードで新しいバッファを作成する場合、バッキングメモリを解放するのは誰の責任ですか?

  • NewDirectByteBufferと、直接バッファーですでに使用されているアドレスを使用して、ネイティブコードで新しいバッファーを作成するとどうなりますか?メモリは二重に解放されますか?VM参照はメモリブロックをカウントし、それを参照する最後のバッファがガベージコレクションされたときにそれを解放しようとしますか?

4

1 に答える 1

6

バッファが最終的に解放される前に、VM がバッファを再配置することは許可されていますか?

ダイレクト バッファーは GC ヒープの一部ではないため、再配置されません。

NewDirectByteBuffer を使用してネイティブ コードで新しいバッファを作成した場合、バッキング メモリを解放する責任は誰にありますか?

それを解放するのはあなた(ネイティブコード)の責任です。JVM は、そのバッキング ストアを割り当てるためにどのメソッドが使用されたかを認識できませんでした (malloc された可能性、静的バッファーなどである可能性があります)。

NewDirectByteBuffer とダイレクト バッファで既に使用されているアドレスを使用して、ネイティブ コードで新しいバッファを作成するとどうなりますか?

VM は NewDirectByteBuffer に渡されたアドレスのメモリを解放しようとしないため、同じアドレスを 2 回渡しても何も起こりません。

于 2009-08-08T08:10:24.063 に答える