1

オブジェクトを finalize メソッドがあるかのように扱わないように Java VM (この場合は HotSpot または Zing) に指示する方法はありますか? 本当に、可能であれば、クラス全体だと思います。

既にリソースが解放されているオブジェクトに問題がありますが、VM にファイナライズを呼び出す必要があると考えるプレッシャーが残っています。

これはライブラリにあるため、クラスを変更する方法はありません。

ユースケースは、ライブラリがオフヒープ リソースをクリーンアップするために作成されたもので、GC にクリーンアップさせることを忘れた場合や決定した場合です。問題は、それらの多くがぶらぶらしていることです。

4

3 に答える 3

3

唯一のオプションは、ファイナライズ実装を空の実装でオーバーライドするエージェント (-javaagent) を使用することです。JVM は、空でないファイナライズを持つクラスのインスタンスごとに FinalReference オブジェクトを自動的に作成します (これは、JVM (Oracle) がファイナライズ可能なオブジェクトを追跡する方法です)。彼の行動を変えることはできません。

于 2016-04-21T15:07:39.957 に答える
1

ユースケースは、ライブラリがオフヒープ リソースをクリーンアップするために作成されたもので、GC にクリーンアップさせることを忘れた場合や決定した場合です。

そのために、Cleanerを使用ByteBufferします。これは、リソースをクリーンアップするためのより軽量な方法です。


編集別のオプションは、あなたができることです

  • そこにある必要のない要素のキューを定期的にクリーンアップするスレッドを追加できますFinalizer.queueFinalizer.lock
  • このキューを独自の実装に置き換えて、動作が異なるようにすることができます。たとえば、選択したクラスのオブジェクトを最初から追加しないでください。
于 2016-04-21T15:03:00.813 に答える