2017-07-20 8 views
0

最近、Javaのガベージコレクションに関する質問がありました。次のように3つの変数(say)、a、b、cがあると、それは次のようになります。 次に、これらはどのような順序でガベージコレクションされますか。Javaのガベージコレクションに関するインタビュー

class Test{ 

static String a; 

private String b; 

Test(String a, String b) 

{ 
    this.a=a; 
    this.b=b; 
} 

void disp(){ 

    System.out.println(a+" "+ b); 
} 

public static void main(String[] args){ 

    String c="Not you Again"; 
    Test t= new Test("Hello","World"); 

    t.disp(); 
    System.out.println("Value of c = "+c); 
} 

} 

は、私は、オブジェクトがそれらの間を移動し、収集方法を若い世代、中東ゲン&パーマゲンなどガベージコレクションの基礎を認識しています。しかし、変数のガベージコレクションは、私が外に出ているものです。 助けてください!

+0

**変数**はガベージコレクションされません。 **オブジェクト**はガベージコレクションされています。 3つの変数はいずれもプリミティブ型int(オブジェクトではない)なので、この質問はあまり意味がありません。 – Jesper

+0

@SarveshGupta 'int'はオブジェクトではありません。ガベージコレクションはできません。 – Moira

+0

これは: 'this.a = a;'は正しいですか? – Edwin

答えて

0

main終了が実行しているとき、彼らはスコープ内のすべてのまだだから。つまり、VMはガベージコレクションを行わずに終了します。

Testコンストラクタのパラメータabについては、ガベージコレクションが行われている可能性がありますが、それはほとんどありません。この特定のプログラムは、ガベージコレクタが開始するにはあまりにも速く終了するでしょう。

+0

2番目の段落はナンセンスです。 'Test'コンストラクタのパラメータはローカル変数であり、変数はまったくガベージコレクションされません。 *オブジェクト*はガーベッジ・コレクションを取得し、コンストラクタ・パラメータで参照されたオブジェクトは、まだ最初の段落で説明したように、まだスコープ内にある他の変数によって参照されます。あなたの答えは* 'Test.a'、' tb'または 'c' ...によって参照される値を参照することでとてもうまく始まりました。そして、そのパラメタ*しかし、参照。 – Holger

+0

@Holger 2番目のパラグラフの意味は明らかです。ガベージコレクションが可能な(おそらくそうではない)これらのパラメータによって参照されるオブジェクトです。 –

+0

まあ、その場合は、これらのオブジェクトは、最初の段落では収集できないと正確に述べているのと同じオブジェクトなので、間違っています。それは、パラメータが収集されず、オブジェクトだけが収集でき、これらの特定のオブジェクトを収集することができないため、「パラメータがガベージコレクトされる可能性があります」というような無意味なことを言うことにまさに問題です。 – Holger

1

すべての3つの文字列変数は、VMが気に入ったときにガベージコレクションされます。気になるならば誰でも制御できません。これらの文字列がいつガベージコレクションされるのかを知っていると主張する者は誰もいない。 Test.at.bまたはcによって参照値が今までゴミが収集されることはありません

+0

私は幾分同じことを言いましたが、静的および非公式の修飾子はコレクションに影響しません。 –

+0

静的メンバーはperm gen領域に格納されるため、最後に収集されることはありません。助けてください! –

+0

@Sarvesh Gupta:シンプルな言い方をすると、これはうそつきです。 [この最初のコメント](https://stackoverflow.com/questions/45207618/interview-on-garbage-collection-in-java#comment77381302_45207618)で既に述べたように、変数はガベージコレクトされません。また、オブジェクトはさまざまな種類の変数の任意の数で参照できるため、変数の型はまったく関係ありません。 'static'変数に参照を格納すると、オブジェクトのメモリ位置が突然変化することはありません。 Java 8では、perm gen領域さえありません。 – Holger

0

ガベージコレクタはこの特定の例では実行されません。 ガベージコレクタは、アクティブなスレッドが存在しない場合にのみ実行されます。この例では、デッドスレッドが存在しないため、ガベージコレクタは決して実行されません。 ガベージコレクタはJVMのみで起動されており、制御できませんが、要求を実行することはできますが、この要求はJVMで無視できます。

関連する問題