blog

徹底分析:オブジェクトの生成プロセスとメモリ割り当てメカニズム、読んだ後99%の人が理解する

メモリ割り当て:JVMはオブジェクトのためにメモリを割り当てます。オブジェクトが必要とするメモリ空間のサイズは、クラスがロードされた後に完全に決定することができ、その本質は、 "ポインタの衝突 "を決...

Mar 23, 2020 · 3 min. read
シェア

オブジェクト生成プロセス

  • ロードチェック:命令のパラメータが定数プールでクラスへのシンボリック参照を見つけることができるかどうかをチェックし、このクラスがロードされているかどうかを検出します。

  • メモリ割り当て:JVMはオブジェクトのためにメモリを割り当てます。オブジェクトが必要とするメモリ空間のサイズは、クラスがロードされた後に完全に決定することができます。

1. "ポインタの衝突":Javaのヒープ内のメモリが絶対的である場合、すべての使用済みメモリが片側に配置され、空きメモリが反対側に配置され、区切り点のインジケータとして中央にポインタが配置され、割り当てられたメモリは、単にオブジェクトのサイズに等しい距離を移動する空き領域側へのポインタです。2.空きリスト:使用済みメモリと空きメモリが混在している場合、単純にポインタをタッチする方法がないため、仮想マシンはどのメモリブロックが使用可能かのリストを保持し、割り当て時にリストからオブジェクトインスタンスに割り当てるのに十分な大きさの領域を見つけ、リスト上のレコードを更新する必要があります。レコード

1.CAS:仮想マシンは、失敗リトライを伴うCASを使用して更新操作のアトミック性を確保し、メモリ領域の割り当て動作を同期させます。2.ローカル・スレッド・アロケーション・バッファ(LTAB):メモリ割り当ては、スレッドに応じて異なるスペースに分割されます。TLABを使用するかどうかを仮想マシンに設定するXX:+/UseTLABパラメーター(JVMはデフォルトでXX:+UseTLABを有効にします)、TLABサイズを指定するXX:TLABSize。

  • 初期化:メモリ割り当てが完了した後、JVMは割り当てられたすべてのメモリ空間をゼロの値に初期化します。 TLABが使用されている場合、このプロセスはTLAB割り当て時に前倒しすることもできます。

  • オブジェクトヘッダの設定:オブジェクトに必要な設定を行います。

  • init() の実行:プログラマが望むように初期化します。

  • スタックへの割り当て:ヒープ上に割り当てられる一時的なオブジェクトの数を減らすために、JVMはエスケープ分析によってオブジェクトがメソッドの外部で参照されないようにします。

エスケープ分析を通じて、オブジェクトが外部からアクセスされることはありませんし、オブジェクトがさらに分解することができます決定するために、JVMは、オブジェクトを作成しませんが、メンバ変数を置き換えるために、このメソッドで使用されるメンバ変数の数のオブジェクトのメンバ変数の分解になります、スタックフレームまたはレジスタ内のこれらの置換は、スペースを確保するために、オブジェクトのメモリの割り当ての不足によって引き起こされる連続空間の大きなブロックがないように十分な。JDK7の後にデフォルトでオンになっているスカラー置換パラメータをオンにします。

スカラーとは、それ以上分解できない量のことで、JAVAの基本データ型はスカラーであり、スカラーの反対は、それ以上分解できる量のことで、この量を集約量と呼びます。JAVAでは、オブジェクトはさらに分解できる集約量です。

public static void main(String[] args) { /*このユーザーのスコープは、メソッド内でのみ有効である。, つまり、これは明らかなスタック割り当てである。*/ SysUser user = new SysUser(); user.setId(1L); user.setBrowser(""); //TODO DB }

ヒープ割り当て:

  • 大きなオブジェクトを直接古い世代へ:S0-S1間でオブジェクトをコピーする際の非効率を避けるため、連続したスペース・メモリを必要とするオブジェクト。

  • 長い間生存しているオブジェクトは旧世代に移行します: メモリ回復では、どのオブジェクトを新世代に移行させ、それらのオブジェクトを旧世代に移行させるかを識別しなければなりません。ここで重要な判断基準はGCオブジェクトの年齢です。 ヤングGCの後、若い世代でまだ生存しているオブジェクトは、その年齢がJVMによって指定されたGC年齢に達した場合、古い世代に移されます。

  • 動的年齢判定:オブジェクトが現在配置されているSurvivor領域内のオブジェクトグループの合計サイズが、このSurvivor領域のメモリサイズの50%より大きい場合、このオブジェクトグループの最大年齢以上のオブジェクトは、古い年齢に直接入力することができます。動的な年齢決定メカニズムは、通常、ヤングGCの後に起動されます。

  • 若い世代がマイナーになるたびに、gcJVMは古い世代の残りの利用可能なスペースを計算します。この利用可能なスペースが若い世代のすべての既存のオブジェクトのサイズの合計よりも小さい場合、フルGCがトリガされます。

Read next

Javaジェネリック

Javaのジェネリック型の利点は、第一に、コードの再利用性と汎用性の向上、第二に、コンパイラが自動的かつ暗黙的に型を変換するためにチェックできる、型に対する特定の制約の追加です。ジェネリック型を理解するには、いくつかの概念を理解する必要があります。

Mar 23, 2020 · 5 min read