2009-08-07 12 views
5

私は、スクラッチスペース用の一時バッファを必要とするCライブラリを持っています。私はそれにダイレクトバイトバッファのアドレスを渡すことを検討しています。NIOダイレクトバッファはいつ、どのように解放されますか?

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

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

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

答えて

5

VMは今までそれが最終的に解放される前に バッファを再配置することができますか?

ダイレクトバッファがGCヒープの一部ではないため、再配置しません。私はNewDirectByteBufferを使用して、ネイティブ コードで新しいバッファを作成した場合

、その 責任それが バックアップメモリ​​を解放するには?

これは無料です(ネイティブコード)。 JVMは、私が を使用して、ネイティブコードで新しいバッファ を作成するとどうなりますか(など、静的バッファ可能性があり、mallocで確保することができる)そのバッキングストアを割り当てるために使用されたものをメソッド

を知ることができませんでしたNewDirectByteBufferとアドレス はすでにダイレクトバッファで使用されていますか?

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

+1

ネイティブコードがバッファを解放する責任があることを示す公式のJavaドキュメントは見つかりませんでした。 – Raedwald

+0

@Raedwaldこの文書を読むことをお勧めします。http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html Javaヒープを管理するのはガーベッジ・コレクターに任されますが、それはあなた次第ですネイティブヒープを管理します。 – gouessej

関連する問題