2

エスケープ分析 (Java 8、64 ビット サーバー JVM) を少し試してみようと思いました。私はこの本当にばかげた「アプリケーション」を思いつきました。そこでは、多くの Address オブジェクトを作成します (郵便番号、通り、国、およびオブジェクトが生成されたタイムスタンプで構成されます)。また、Address には isOk() メソッドがあり、それを返しますタイムスタンプが 7 で割り切れる場合は true...)。

プログラムは次のとおりです。

private boolean generate() {
    boolean valid = true;
    for (int i=0;i<1_000_000_000;i++) {
        valid = valid && doGenerate();
    }

    return valid;
}

private boolean doGenerate() {
    long timeGenerated = System.currentTimeMillis();
    Address address = new Address(1021, "A Street", "A country", timeGenerated);
    return address.isOk();
}

これまでのところ、jVisualVM でプロファイリングしましたが、実行中にヒープに Address オブジェクトはありません。アプリケーション全体が数秒で完了します。

ただし、次のようにリファクタリングすると:

private boolean generate() {
    boolean valid = true;
    for (int i=0;i<1_000_000_000;i++) {
        long timeGenerated = System.currentTimeMillis();
        Address address = new Address(1021, "A Street", "A country", timeGenerated);
        valid = valid && address.isOk();
    }

    return valid;
}

Baaang、エスケープ分析はありません。すべての Address オブジェクトは、重いガベージ コレクション サイクルでヒープに割り当てられてしまいます。なぜそうなのですか?つまり、Address インスタンスはどちらの方法でもエスケープしません (2 番目のバージョンでは、Address オブジェクトのスコープはさらに狭くなり、for ループ ブロックでさえメソッドをエスケープしません)。

4

1 に答える 1

4

「タイムスタンプが 7 で割り切れる場合に true を返す<​​em>」と記述します。それは何が起こるかを明らかにするはずです。最初のコードで:

boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
    valid = valid && doGenerate();
}
return valid;

validfalseタイムスタンプがたまたま で割り切れなくなるとすぐに になり7ます。次に、仕組みに従って、それは永遠&&に残り、短絡しているため、割り当てを担うメソッドは二度と呼び出されません。false&&doGenerate()

対照的に、2番目のバリアントでは

boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
    long timeGenerated = System.currentTimeMillis();
    Address address = new Address(1021, "A Street", "A country", timeGenerated);
    valid = valid && address.isOk();
}
return valid;

validfalseタイムスタンプがたまたま で割り切れなくなるとすぐににもなり、残ります7が、短絡するのは の呼び出しだけですisOk()。の値に関係なく、構築が行われますvalid

原則として、Addressここでは の構築を省略できますが、ループの実行中に発生する必要があるため、スタック上での置き換えが必要になります。それがここでの問題かどうかは明らかではありませんが、より重要な結論は、どちらの場合も EA が発生していないことです。最初のケースのように、割り当てを含むメソッドを呼び出していません (未知の、しかし予想される少数呼び出しの)まったく。

したがって、2 つの例は等価ではなく、エスケープ分析について結論を出すことができません。

于 2015-10-19T14:27:27.020 に答える