私は、スクラッチスペース用の一時バッファを必要とするCライブラリを持っています。私はそれにダイレクトバイトバッファのアドレスを渡すことを検討しています。NIOダイレクトバッファはいつ、どのように解放されますか?
最終的に解放される前に、VMがバッファの再配置を許可されていますか? JNIフレームが消えた後、ネイティブライブラリはポインタを保持します。私の理解では、JNIローカルオブジェクトの参照は、GCがGC中に再配置する可能性があるため、キャッシュできません。これはバッファアドレスに適用されますか?
私は、Javaでバッファを割り当ててからバッファオブジェクトをスコープ外に出すと、VMがバッファメモリを解放することを理解しています。 NewDirectByteBufferを使用してネイティブコードで新しいバッファを作成した場合、バッキングメモリを解放するのはその責任ですか?
NewDirectByteBufferとダイレクトバッファで既に使用されているアドレスを使用してネイティブコードで新しいバッファを作成するとどうなりますか?記憶は二重に解放されるのだろうか? VMリファレンスはメモリブロックをカウントし、それを参照する最後のバッファがガベージコレクトされたときに解放しようとしますか?
ネイティブコードがバッファを解放する責任があることを示す公式のJavaドキュメントは見つかりませんでした。 – Raedwald
@Raedwaldこの文書を読むことをお勧めします。http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html Javaヒープを管理するのはガーベッジ・コレクターに任されますが、それはあなた次第ですネイティブヒープを管理します。 – gouessej