10

GC ルートについて質問があります。GC ルートの 1 つが「ライブ スレッド」であることを読みました。どういう意味ですか?

各スレッドには独自のスタックがあり、スタックのローカル変数はスレッドの GC ルートであるという印象を常に持っていましたが、今では混乱しています。フレーム スタックまたはネイティブ スタック上にない、スレッド表現に含まれるオブジェクト参照には、他にどのような種類がありますか?

もう 1 つの質問は、若い世代のコレクションが GC ルートを使用するのか、それとも主要なアルゴリズム専用なのかということです。

ありがとう

更新: 申し訳ありませんが、簡単にするために: 私はこの短い記事を読みました: yourkit.com/docs/java/help/gc_roots.jsp と GC ルートとして「スレッド」オプションがあります。それはそのスレッドを正確に意味しますGCルートですか?スレッド GC ルートによって参照され、そのスタックによって参照されないオブジェクトの種類は何ですか? これらの 2 つのカテゴリが異なるのはなぜですか。

4

3 に答える 3

0

JVM はそのスレッドを分割し、一部はガベージ コレクション専用に使用され、一部は他の内部 JVM タスクに使用され、一部は実行可能ファイルのユーザー提供部分を実行します。

このコンテキストでは、到達可能とは、ユーザー実行スレッドによって到達可能であることを意味します。これには、実行するようにバインドされている最初のスレッドとpublic static void main(String[] args)、そのスレッドから起動されたすべてのスレッドから、到達不能または完了したものを除いたものが含まれます。

于 2014-10-07T14:14:34.860 に答える
0

java スレッド オブジェクト ローカル new'ed を持つメソッドを想像してください。メソッドが終了すると、オブジェクトはなくなります (参照はスコープ外になり、ヒープに割り当てられたメモリは GC の対象になります)。同じメソッドでスレッドを開始すると、そのスレッド オブジェクトとそれが参照するもののライブ タイムも、実行中のライブ スレッドのライフ タイムに結び付けられます。スレッドが終了するまで、実行中のスレッドからまだ参照されているメモリは GC の対象外であり、スレッドは GC ルートと呼ばれます。

スレッドは、スタックまたはヒープを介して 2 つの異なる方法でメモリを割り当てることができます。スタック ストレージは GC されませんが、現在のスタック フレームが巻き戻されるときに再利用されます。通常、コードで「new」を使用すると、ヒープ ストレージが割り当てられます (new は常にヒープ ストレージを意味するわけではないことに注意してください。エスケープ解析を参照してください)。ヒープは GC されます。

GC ルートについて詳しく知る良い方法は、実行中の Java アプリケーションのヒープ ダンプを取得し、それを Visual VM または Eclipse MAT にロードすることです。そこから GC ルートを調べることができます。

若い世代のコレクションでは、GC ルートを持つオブジェクトは GC の対象にならないという点で GC ルートを使用しますが、特定のアルゴリズムの観点から説明する方がよいでしょう。

于 2014-10-07T13:55:55.513 に答える