JavaとC#のメモリの割り当てとリリースは、仮想マシンによって自動的に管理されます。私は以前、CLRにGCオブジェクトリサイクル法を導入しました。これは、世代ベースのメモリリサイクル戦略です。実際、Javaでは、JVMオブジェクトのリサイクル戦略も世代の分割のアイデアに基づいています。これの目的は、ゴミを増やすことです
JVMがGCを実行すると、他のスレッドの動作を終了し、リサイクルが完了した後に他のスレッドの操作を回復するため、JVMがGCを実行すると、ヒープ内のすべてのオブジェクトをチェックすることによって引き起こされるプログラム応答の遅延が回避されます。世代間部門に基づくアイデアは次のとおりです。JVMは、ゴミコレクターを実行するたびに記憶のごく一部のみを必要とします。
オブジェクトの参照がチェックされ、この少数のオブジェクトのライフサイクルが短く、ガベージコレクションのパフォーマンスを高速化します。以下に、将来のJavaの生成ベースのメモリ回復アルゴリズムの基本戦略を紹介します。
1。JVMヒープメモリの生成分割
世代ベースの記憶回復戦略では、ヒープスペースは通常、3世代、若い世代、古い世代(または終身在庫)、および永続的な世代に分割されます。若い世代の中には、下の図に示すように、Eden、S0、およびS1の3つの小さな領域があります。
その中で、新しいオブジェクトは常に年齢の世代に割り当てられています。若い世代のスペースが満たされた場合、ゴミコレクションを実行する必要があります。つまり、マイナーGCが実行され、もはや参照されていないオブジェクトをリサイクルし、同時に生存するオブジェクトの年齢を増やします。年齢世代の生き残ったオブジェクトには、年齢識別分野があります。それらが特定のしきい値に達すると、まだ生き残っているオブジェクトは古い世代の空間に促進されます。
古い世代の空間は、長い間生き残ってきたオブジェクト、つまり長いライフサイクルのオブジェクトを保存するために使用されます。若い世代の空間の生き残ったオブジェクトが特定の年齢のしきい値に達すると、古い世代に自動的に宣伝されます。古い世代のスペースがオブジェクトで満たされると、メジャーGCが1回実行されます。マイナーGCと比較して、主要なGCの実行数はマイナーGCの実行数よりもはるかに少ないです。同時に、メジャーGCはマイナーGCよりも長く実行されます。より多くのオブジェクトスキャンが含まれるためです。この世代のアイデアは、実際には、新しく割り当てられたオブジェクトのライフサイクルが短く、年配のオブジェクトがより長いライフサイクルを持つという、実際にはより良い選択に基づいています。
同時に、マイナーGCとメジャーGCがゴミコレクションを実行すると、彼らは世界イベントを停止します。つまり、実行中のスレッドを終了し、GCが実行されたときにすべてのスレッドを復元します。
永続的な生成メモリの場合、主にメタデータの関連情報、クラス、および方法の情報を保存するために使用されます。クラスが使用されなくなると、リサイクルされます。完全なGCが実行されると、ガベージコレクションのために永続的な生成メモリがスキャンされます。
2。生成ベースのガベージコレクションの処理プロセス
まず、最初は新しいオブジェクトがEdenエリアに割り当てられ、S0とS1は空です。エデンのスペースが満たされたら、マイナーGCを1回実行します。ガベージコレクターは参照されたオブジェクトをS0領域に移動し、参照されなくなったオブジェクトは削除されます。同時に、存続するオブジェクトの年齢は1です。GCが特定された後、下の図に示すようにEdenとS1の領域は空です。
次にマイナーGCが実行されるとき、以前の実行ステップと同じで、唯一の違いは、参照されるオブジェクト、つまり存続するオブジェクトがS1領域に移動し、S0領域で生存するオブジェクトの年齢は1と2に増加します。
マイナーGCが再び実行されると、存続するオブジェクトはS0エリアに移動し、下の図に示すように、存続するオブジェクトの年齢に1を追加します
マイナーGCが最終的に実行されると、S1の存続するオブジェクトが8に達することがわかります(しきい値が8に設定されていると仮定)、下の図に示すように、オブジェクトは老齢記憶に宣伝されます。
z
古いヒープスペースにオブジェクトが満たされると、メジャーGCが1回実行されます。これにより、古いヒープがもはや参照されなくなり、同時にスペースを圧縮するオブジェクトがクリアされます。下の図に示すように。
JVMのゴミリサイクル戦略に関する上記の簡単な議論は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。