エスケープ分析 (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 ループ ブロックでさえメソッドをエスケープしません)。