同じ結果を生成する 2 つのアルゴリズムがある場合、最初のアルゴリズムは再帰に基づいており、もう 1 つはループ ベースのアルゴリズムであり、純粋なプログラム フロー管理に関してより多くのガベージ コレクションが発生しますか?
3 に答える
呼び出しの各レイヤーは呼び出しスタック内の新しい要素であるため、再帰だけでは追加のスタック使用が発生しますが、余分なヒープは使用されません (スタック情報を追跡するためのおそらく小さなオブジェクトまたは 2 つの使用を除いて - それらはヒープに割り当てられているかどうかはわかりません)。
ただし、典型的な再帰アルゴリズムでは、余分なヒープ オブジェクトはそれほど長くは続かない可能性が高く、次の若い世代のコレクションでクリーンアップされます。そのため、ガベージ コレクションが大幅に増えることはありません。
JVM はスタック フレームをヒープとは別に保持します。したがって、それらはガベージコレクションされません。メソッド呼び出し内でオブジェクトを初期化しない限り、再帰はヒープに影響しません。ここに記事があります。ただし、スタック フレームを割り当てるための追加の時間が必要なため、繰り返しよりも遅くなります。
基本的に (単純化しすぎていますが)、Java メモリはスタックとヒープの 2 つのセグメントに分割されます。コール/リターンはスタックで追跡されます。これは、エントリがコールで「プッシュ」され、リターンで「ポップ」されるという明らかな方法で行われます。このスキームは「自己管理」であり、ガベージ コレクションを整理する必要はありません。
もちろん、他のヒープベースのオブジェクトが各呼び出しフレームに割り当てられる場合もありますが、それは再帰とは関係ありません。また、一般的に言えば、再帰アルゴリズムを使用すると、非再帰の場合にヒープに割り当てられた進行状況を追跡するためのデータ構造が不要になります。