DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

6章4

このJavaのコードはガベージコレクションがいつ起きるかに関するものですね。Javaでは、オブジェクトにもうアクセスできなくなった時点でガベージコレクションによってメモリが回収される可能性があります。このコードを見てみましょう。

1. public class Main {
2.   public static void main(String[] args) {
3.     Object a = new Object();  // aに新しいオブジェクトを割り当てる
4.     Object b = new Object();  // bに新しいオブジェクトを割り当てる
5.     Object c = a;             // cはaが参照するオブジェクトを参照する
6.     a = null;                 // aの参照をnullにする(aが参照していたオブジェクトはガベージ対象に)
7.     b = null;                 // bの参照をnullにする(bが参照していたオブジェクトはガベージ対象に)
8.     // more code
9.   }
10. }
Enter fullscreen mode Exit fullscreen mode

コードにコメントを付け加えた通りです。このコードによれば、行6でaが参照していたオブジェクト、行7でbが参照していたオブジェクトがガベージコレクションの対象になります。しかし、cは行5でaが参照していたオブジェクトを参照しており、行6と行7でabの参照がnullにされた後も、cを通じてそのオブジェクトにアクセス可能です。

問題の選択肢は以下の通りです。

A. 3行目で作成したインスタンスだけが、ガベージコレクションの対象となる
B. 4行目で作成したインスタンスだけが、ガベージコレクションの対象となる
C. 3行目と4行目で作成したインスタンスが、ガベージコレクションの対象となる
D. ガベージコレクションの対象となるインスタンスは存在しない

正しい答えはBです。これは4行目で作成されたオブジェクト(bによって参照されていたオブジェクト)が、行7でbの参照を失っているためです。他方で、3行目で作成されたオブジェクトはcによってまだ参照されているため、ガベージコレクションの対象にはなりません。

Top comments (0)