2

以下のコードでは、GCアクティビティがたくさん見られます。私の理解によると、これはEAに適したシナリオです。EAが効果的でない理由。DummyObjectには何も割り当てられていません。使用されるJVMオプション:-server、-verbosegc。

   static void anayzeEA()
{
    for(int i = 0 ; i < 100000000; i++) {
        DummyObject obj = new DummyObject();
        if(obj.hashCode() == 97787) { //to prevent the obj being optimized            
         System.out.println(obj.hashCode());
        }
    }

}
4

3 に答える 3

1

デバッグ JDK をダウンロードしてコマンド ライン オプションを使用できることを示唆する関連 Q&A を参照してください: -XX:+UnlockDiagnosticVMOptions -XX:+PrintEscapeAnalysis -XX:+PrintEliminateAllocations

エスケープ分析イベントが発生したときに印刷します。

于 2013-01-14T16:01:12.680 に答える
0

Java API は次のように述べています。

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)

したがって、オブジェクトを生成し、それぞれに対して予測不可能な hashCode を生成し、それらを何らかの値と比較します。さらに、これはネイティブ メソッドであるため、JIT は内部で何が起こっているかを知りません。

Escape Analysis は良いかもしれませんが、現在 Crystal Ball はサポートされていません。;-) 12345 を返す独自のメソッドでオーバーライドしてみてください。

于 2013-01-14T16:23:02.070 に答える
0

いくつかの観察

obj.hashCode() はネイティブ呼び出しであり、オブジェクトがエスケープする可能性があるようです。obj.hashCode() を obj.getMyCode() (System.currentTimeMillis()% staticObjCount を返すメソッド) に変更すると、機能しました。GC アクティビティは観察されませんでした。ただし、次の方法では、ここに記載されているすべての提案でエスケープ分析が有効になることはありませんでした

 public static long test1() 
{
    long r = 0;
    byte[] arr = new byte[(int)System.currentTimeMillis() % 1024]; 
    if(arr.length == 998 ) {
        ++r;
    }
    return r;
}

使用される JVM オプション -server -verbosegc -XX:CompileThreshold=1

Test1 は何度も呼び出されます。同じ昔話。Javaはメモリをヒープに割り当て、GCが来てすべてを遅くします。はこの機能に興奮しすぎていました。

于 2012-06-29T06:29:01.317 に答える