I.はじめに知識寝具
図1に示すように、オブジェクトをエスケープ:オブジェクトの外に参照されなかった方法で作成されたオブジェクトがエスケープしていないオブジェクトと呼ばれています。
2は、JDK1.6以降のHotSpot仮想マシンランタイムオブジェクトは、分析支援を逃れます。
3、JVMの設定パラメータ:
。1 1)-XX:+ PrintFlagsInitial - デフォルトのパラメータは、JVMの情報を表示するために、 2 3。 2) - XX:+ DoEscapeAnalysis - エスケープ解析目標開度(JDK8)がデフォルトで有効になっ 。4 。5 。3) - XX:-DoEscapeAnalysis - クローズオブジェクトエスケープ分析 6。 7。 4)-XX:+ PrintGC - GCの基本的な情報出力 。8 。9 。5)-XX:+ PrintGCDetails - GC出力の詳細 10 。11 。6)-Xmx5m / -Xms5m -最大/最小ヒープ構成
オブジェクトが作成された第二に、メモリの割り当て
オブジェクトが作成されたとき、スタック上に割り当てられてもよい1は、ヒープ上に存在割り当てることができます。
2、小さなオブジェクトと内部メソッドがスタックに割り当てられて逃げられないかもしれ作成します。
3は、JDK8はデフォルトのエスケープ分析によってオン、実装は、JVMのパフォーマンスが向上します。
4 、共有オブジェクトではなく、マルチスレッド、この時点で、複数の共有方法であれば、設計オブジェクトは、オブジェクトへの参照は、ローカル変数を利用する必要があるとき。
JVMの実行パフォーマンスのオンとオフエスケープ解析の第三に、インパクト
まず、例を見てみましょう。
1つの パブリック クラスTestObjectInstance01 { 2 公共 静的 ボイドメイン(文字列[]引数){ 3 長い開始= にSystem.currentTimeMillis(); 4 のためには、(int型 i = 0; iが100000000を<; Iは++ ){ 5 // 调用ALLOC()方法 6 ALLOC()。 7 } 8 長い端= にSystem.currentTimeMillis(); 9 のSystem.out.println( "运行时间:" +(エンド)開始)。 10 } 11 12 プライベート 静的 ボイドALLOC(){ 13は //は唯一つのアレイオブジェクト格納することができるバイトを作成する 14 バイト [] = ARR 新しい新しい バイト [1。]; 15 ARR [0] = 10 ; 16 } 17 }
私たちは、最大/最小JVMのヒープパラメータを設定し、エスケープ分析を開くには:
-Xmx5m -Xms5m -XX:+ DoEscapeAnalysis -XX:+ PrintGC
結果:
その後、我々はエスケープ解析を閉じました。
-Xmx5m -Xms5m -XX:-DoEscapeAnalysis -XX:+ PrintGC
結果:
結果の分析:
エスケープ分析をオンにするとき私たちは、業績のJVMがオンになっていない場合よりもはるかに高い、それを見ることができます。スタックに割り当てられたオブジェクトは、メソッド呼び出しスタックは、オブジェクトは自動的に破棄されたときに、回復するためにGCを起動する必要はありませんので。