1

効果的なJava2ndEditionアイテム7から:ファイナライザーを避ける

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

オブジェクトを作成および破棄する時間をどのように測定できますか?あなたはただしますか:

long start = System.nanoTime();
SimpleObject simpleObj = new SimpleObject();
simpleObj.finalize();
long end = System.nanoTime();
long time = end - start;
4

4 に答える 4

2

それは finalize メソッドを実行する時間を測定するだけです。ファイナライズのコストの大部分は、GC が実行しなければならない特別な処理にあります。

于 2010-04-03T14:29:03.427 に答える
1

Tom Hawtin が上で述べたように、これを無駄にマイクロベンチマークしようとする代わりに、作成と破壊の数十万サイクルを実行する時間を調べ、サイクル数で割るのが最善の方法です。

このアプローチは、記述したコードが関係する唯一のコードではなく、システム コールや外部リソースに依存している多くの状況で最適です。

この場合、Joshua Bloch がそれを行ったと思いますが、私のコピーは 2 階にあり、怠惰に感じています。

于 2010-04-03T15:29:51.643 に答える
0

を介してランタイムにガベージ コレクションを実行するように要求できますRuntime.gc()が、ガベージ コレクターはすぐに実行する必要はありません。

  • このfinalize()メソッドはユーザーではなく、ガベージ コレクターによって呼び出されます。
  • simpleObjを に設定するだけnullで、ガベージ コレクションを呼び出して、より現実的なシナリオを実現できます。
于 2010-04-03T15:18:22.107 に答える
0

java.lang.ref考えられる解決策の 1 つは、ガベージ コレクターとの限られた程度の対話のみをサポートするパッケージに依存することです。

オブジェクトの本当の結末を知ることは難しいため、測定結果は正確ではありませんでした。ジョシュアは時間を測定する別のアプローチを持っているに違いないと私は信じています.JVM自体に向かうかもしれません.

PhantomReferenceオブジェクトのライフサイクルの終わりに最も近い参照。つまり、オブジェクトはファントム リーチ可能です。

public class WithoutFinalizationV1 {
    
    public static void main(String[] args) {
        ReferenceQueue<WithoutFinalizationV1> queue = new ReferenceQueue<>();
        long start = System.nanoTime();
            
        PhantomReference<WithoutFinalizationV1> rf = new PhantomReference<>(
        new WithoutFinalizationV1(), queue);
        System.gc(); //advise JVM to do GC
            
        Object x = null;
        int waitCount = -1;
        do{
            x = queue.poll();
            waitCount++;
        } while(x == null);
            //only need this time point
        System.out.println("WithoutV1 "+ waitCount + " " + (System.nanoTime() - start));
    }
}

数回実行すると、世界記録は 5394860ns で、5.6ns には程遠いものです。

追加後

@Override
protected void finalize() throws Throwable {
}

結果は 5632208ns です。

これは私が書いた関連記事からの抜粋です。

于 2021-07-22T14:25:18.413 に答える