[JVM]-[Java仮想マシンの徹底理解学習メモ]-エスケープ解析

序文

エスケープ分析の基本原理は、オブジェクトの動的スコープを分析することです。オブジェクトがメソッドで定義されている場合、そのオブジェクトは、呼び出しパラメータとして他のメソッドに渡されるなど、外部メソッドによって参照されることがあります。これはメソッド エスケープ と呼ばれます他のスレッドでアクセスできるインスタンス変数に割り当てられるなど、外部スレッドからアクセスされる場合もあり、これをスレッドエスケープと呼びます。オブジェクトの脱出度は低いものから高いものまで次のように分類できます。逃げないでメソッドエスケープ同様にスレッドエスケープ
オブジェクトがメソッドまたはスレッドの外にエスケープしないことが証明できる場合、つまり、他のメソッドまたはスレッドがこのオブジェクトにアクセスできない場合、またはエスケープの程度が比較的低い場合は、このオブジェクトに対して異なる程度の最適化を採用できます。

スタック割り当て

スタック上への割り当てとは、オブジェクトがスレッドから抜け出さないと判断した場合、オブジェクトをヒープではなくスタック上に割り当て、オブジェクトが占有するメモリ空間をスタックフレームとして拡張できるようにすることを意味します。破棄 スタック
への割り当てが使用される場合、エスケープされないオブジェクト、またはメソッド エスケープのみが発生します (スタックへの割り当てではメソッド エスケープはサポートされますが、スレッド エスケープはサポートされません。結局のところ、仮想マシン スタックはスレッドに対してプライベートです)。ヒープ上のスペースを占有してガベージ コレクターにリサイクルを任せるのではなく、メソッドの最後で自動的に破棄できるため、ガベージ コレクター サブシステムへの負荷が大幅に軽減され、コストも節約されます。ヒープ上のスペース

スカラー置換

仮想マシン内の元のデータ型 (int、long、その他の数値型や参照型データなど) など、データをより小さなデータに分解して表すことができなくなった場合。参照型データはオブジェクトとは異なります。参照型データはオブジェクトのアドレスを保存し、このアドレスの値は自然には分割できません。ただし、オブジェクトは異なり、内部に多くの変数が格納されており、分割可能です)さらに分解することはできません。その場合、これらのデータはスカラーと呼ぶことができます。相対的に、データが分解し続けることができる場合
それは集合体と呼ばれます(集合体 集合体Java におけるオブジェクトは代表的な集合体であり、プログラムアクセス
状況に応じて Java オブジェクトを分解し、そのオブジェクトが使用しているメンバ変数を元の型に戻す処理を「集合体 (aggregate ) 呼びますスカラー置換により、
オブジェクトがメソッド外でアクセスされず、このオブジェクトが分解できることが証明された場合、プログラムの実行時にこのオブジェクトを作成する必要はなく、アクセスされるオブジェクトをいくつか直接作成します。このメソッドで使用するメンバ変数
このようにして、オブジェクトのメンバ変数をスタック上に確保し、読み書きすることができます。スカラー置換は、スタック割り当ての特殊なケースとみなすことができます。スタックにオブジェクトを割り当てるだけでなく、メソッドで使用されるメンバー変数のみも割り当てます。ただし、エスケープの要件が高く、オブジェクトのエスケープは許可されません。 to メソッドの外側、つまりエスケープしないオブジェクトのみが許可されますスタックへの割り当てに基づいて、オブジェクトはスレッドからエスケープするだけでなく、メソッドからもエスケープしないため、スタックに割り当てるだけでなく、より高度に最適化されていることがわかります。スカラー形式に分割すると、ヒープ上に作成されるオブジェクトの数が減り、GC の数も減ります。

同期の排除

エスケープ分析により、変数がスレッドからエスケープされず、他のスレッドからアクセスできないと判断できた場合、この変数の読み取りと書き込みの競合はなくなり、この変数に実装された同期手段は安全に削除できます。これにより、スレッド同期の時間のかかる操作も節約されます。

おすすめ

転載: blog.csdn.net/Pacifica_/article/details/124480997