2012-01-19 22 views
9

私たちはC++でポインタの概念を持っています。今度は、C++でメモリを割り当てて、オブジェクト参照(JNIを使​​用)としてJavaに渡すと、誰がそれを解放し、誰が解放するのですか。JNI、ガベージコレクションとポインタ - Java/C++には何をすべきか?

1.)ガベージコレクタは自動的にJavaで動作しますか?

2.)ラップされたJNIクラスのファイナライズメソッドのポインタを明示的に削除する必要がありますか?

3)それとも我々だけでファイナライザが信頼することができないよう(確定)と、オブジェクト

4)を削除または割り当て解除するにはいくつかの方法があるC++コードを呼び出すためにJavaの責任であることを忘れなければなりませんメモリ自体を直接Java自体で(どのようにJava intreprets C + +ポインタinorderそれを削除するために)?

(JavaからC++にオブジェクトを渡すとき)これとその逆の場合のベストプラクティスは何ですか?

答えて

8

私たちはポインタの概念をC++で持っています。今度は、C++でメモリを割り当てて、オブジェクト参照(JNIを使​​用)としてJavaに渡すと、誰がそれを解放し、誰が解放するのですか。

通常、アロケータはデータを解放するための最適な方法です。

1.)ガベージコレクタは自動的にJavaで動作しますか?

この問題は、いつ実行されるかわかりません。

2.)明示的にラップされたJNIクラスのファイナライズメソッドのポインタを削除する必要がありますか?

C++で削除する必要があることを意味するのではなく、Javaでrelease()メソッドを使用する方がよいでしょう。 C++にメモリをリサイクルさせたいかもしれません。

3)それとも我々だけでファイナライザが信頼することができないよう(確定)と、オブジェクト

あなたが意味する場合は、メモリを割り当てを削除しますC++コードを呼び出すためにJavaの責任であることを忘れなければなりませんJavaで実装し、C++に渡して移植します。これは私の好みです。

私はByteBuffer.allocateDirect()を使用することができます。((DirectBuffer) buffer).cleaner().clean();を呼び出して確定的にクリーンアップすることができます。

これにより、メモリを簡単にリサイクルできるようになります。同じバッファをアプリケーションの存続期間中使用することができます。

+0

+1明らかに、アロケータは解放するものでなければならず、Java側(可能であれば)を「クリーナー」に割り当てる必要があります。 – Viruzzo

+0

JavaがC++を呼び出す場合、私はそのクリーナーに同意します。 –

+0

ポイント番号2の場合、Javaのリリースメソッドは実際にオブジェクトを削除するC++メソッドを呼び出しますか?どのようにJavaはC++で割り当てられたメモリを直接解放できますか? – seahorse

関連する問題