2

この驚くべき本の中で、著者のジョシュ・ブロッホは次のように述べています。

「ああ、もう 1 つ: ファイナライザーを使用するとパフォーマンスが大幅に低下します。私のマシンでは、単純なオブジェクトの作成と破棄にかかる時間は約 5.6 ns です。ファイナライザーを追加すると、時間が 2,400 ns に増加します。つまり、ファイナライザーを使用してオブジェクトを作成および破棄するのは、約 430 倍遅くなります。」

Javaで削除してオブジェクトを作成する方法はありますか?
オブジェクトを範囲外にするか、null にリセットするだけでよいと考えました。
私は自分のマシンでこれを実験するつもりです。楽しいアイデアのようですが、削除して反対する方法がわかりません。

4

2 に答える 2

2

オブジェクトへの強力なルート参照がなくなると、オブジェクトは存在しなくなります。ほとんどの場合、それはまさに起こるべきことです。ただし、場合によっては、オブジェクトは、そのサービスが不要になったことを他のエンティティに知らせるという約束と引き換えに、外部のエンティティに何かを依頼することがあります。たとえば、「ファイル」オブジェクトは、ファイルへの排他的アクセスを OS に要求する場合があります。そのようなアクセスが不要になったと OS に通知されるまで、他のすべてのユーザーがそのファイルを使用する能力をブロックします。

そのような約束をしたオブジェクトが放棄され、単に存在しなくなった場合、外部エンティティは、その行動がもはや何の利益にもならないにもかかわらず、他のすべての人に損害を与えるために、求められたことは何でもやり続けるでしょう。誰でも。この状況を回避するために、Java はオブジェクトが放棄されたように見えることに GC が気付いたときにオブジェクトが通知を要求できるようにします。このような通知はFinalize、オブジェクトが存在しなくなる前に行われます (つまり、そのようなオブジェクトに対して呼び出されます) が、それ以降の適時性についての実際の保証はありません。ファイナライズされたオブジェクトは、その代わりに動作するすべてのエンティティに、その動作を停止する必要があることを通知できます。

Java の作成者は、オブジェクトが外部エンティティにサービスが不要になったことを通知できる主要なメカニズムとしてファイナライザーを期待していたかもしれませんが、ファイナライズは実際にはうまく機能しません。多くの場合、AutoCloseableまたはなどの他のメカニズムの方が優れています。PhantomReference

于 2014-10-15T20:19:53.130 に答える