[J2SE1.4] ガーベッジコレクション

ガーベッジコレクション(GC)=ゴミ集め
ゴミ=Javaプログラム中の不要になったオブジェクト

オブジェクトの要/不要=オブジェクトに対しての参照あり/なし
※参照されてるのに、GC対象となるケースもある。

Account a = new Account();
 参照変数 a ―参照→ Accountオブジェクト

a = null;
 参照変数 a ―×→ Accountオブジェクト
              →AccountオブジェクトはGC対象になる

GC対象となったオブジェクトは、直ぐにGCされメモリ開放となるわけでなく、
JavaVMが適当なタイミングでまとめてGCする。

--------------------------------------------------
Q1 GCされる可能性があるの何行目の後?

1:public class GCTest {
2:  public static void main(String[] args) {
3:    String str = "hello!";
4;    str = "g'bye!";
5:    System.out.pringln(str);
6:  }
7:}

a. L.3
b. L.4
c. L.5
d. L.6

A1

×a. L.3
○b. L.4
   L.3で、"hello!"というStringオブジェクトが作られ、
   それがString型参照変数strで参照されてる。
   L.4では、新たに"g'bye!"というStringオブジェクトが作られ参照されてる。
   この時点で、"hello!"Stringオブジェクトは何処からも参照されなくなるので、GC対象になる。
×c. L.5
×d. L.6

--------------------------------------------------
Q2 GCされる可能性があるのは、何行目の後?

1:public class GCTest {
2:  public static void main(String[] args) {
3:    String str = "hello!";
4:    str = str + " hogehoge";
5:    System.out.pringln(str);
6:  }
7:}

a. L.3
b. L.4
c. L.5
d. L.6

A2

×a. L.3
○b. L.4
   L.3で、"hello!"Stringオブジェクトが作られ、String型参照変数strに参照されてる。
   Stringオブジェクトは、内容を変更できないオブジェクト。
   L.4では、Stringオブジェクトの中身を置き換えてるように見えるが、そうではなく、
   新たに" hogehoge"Stringオブジェクトが作られ、演算によって"hello! hogehoge"Stringオブジェクトが作られる。
   結果、"helllo!"と" hogehoge"Stringオブジェクトは、参照されなくなり、GC対象になる。
×c. L.5
×d. L.6

--------------------------------------------------
Q3 GCされる可能性があるのは、何行目の後?

01:class Person {
02:  public String name;
03:  Person(String name) {
04:    this.name = name;
05:  }
06:}
07:public class GCTest {
08:  static Person func() {
09:    Person a = new Person("Shriver");
10:    return a;
11:  }
12:  public static void main(String[] args) {
13:    Person shriver = func();
14:    System.out.println(shriver.name);
15:  }
16:}

a. L.9
b. L.10
c. L.13
d. L.14
e. L.15

A3

×a. L.9
×b. L.10
×c. L.13
×d. L.14
○e. L.15

func()メソッド内9行目で作られるオブジェクトが、
どのタイミングでGC対象になるかがポイント。
このオブジェクトは、メソッド内の参照変数aから参照されている。

メソッド処理が終わると、変数の持つ参照はなくなるが、
戻り値としてshiriverという参照変数に参照されている。

main()メソッドの最後までshiriverに参照されているので、
GC対象になるのは、main()メソッドのブロックの後になる。

--------------------------------------------------
Q4 GCされる可能性があるのは、何行目の後?

01:class GCObject {
02:  public GCObject obj;
03:  GCObject() {
04:    this.obj = this;
05:  }
06:}
07:public class GCTest [
08:  public static void main(String[] args) {
09:    GCObject a = new GCObject();
10:    System.out.println();
11:    a = null;
12:    System.out.plintln();
13:  }
14:}

a. L.9
b. L.10
c. L.11
d. L.12
e. L.13

A4

×a. L.9
×b. L.10
○c. L.11
   ポイントは、4行目のように自分自身への参照を保持しているオブジェクト。
   例え参照があっても、その参照が自分自身からのみであれば、そのオブジェクトはGC対象になるため、
   11行目で参照変数aからの参照が無くなった時点でGC対象になる。
×d. L.12
×e. L.13

--------------------------------------------------
Q5 GCされる可能性があるのは、何行目の後?

01:class GCObject {
02:  public GCObject obj;
03:}
04:public class GCTest {
05:  public static void main(String[] args) {
06:    GCObject a = new GCObject();
07:    GCObject b = new GCObject();
08:    a.obj = b;
09:    b.obj = a;
10:    a = null;
11:    b = null;
12:    System.out.println();
13:  }
14:}

a. L.8
b. L.9
c. L.10
d. L.11
e. L.13

A5

×a. L.8
×b. L.9
×c. L.10
○d. L.11
×e. L.13

ポイントは、相互に参照を保持してるオブジェクトの扱い方。
相互に参照していても、その参照がいくつかのオブジェクト間で閉じている場合、
それらオブジェクト群は、まとめてGC対象になる。

--------------------------------------------------
Q6 強制的にGCするには?

a.強制的にメモリから開放することはできない
b.対象オブジェクトへの全ての参照をnullにする
c.そのオブジェクトへの全ての参照をnullにして System.gc()を実行する
d.そのオブジェクトへの全ての参照をnullにして Runtime.gc()を実行する

A6

○a.強制的にメモリから開放することはできない
×b.対象オブジェクトへの全ての参照をnullにする
   オブジェクトへの参照がなくなると、GC対象となり、
   JavaVMがGCを実行したタイミングでメモリから開放される。
×c.そのオブジェクトへの全ての参照をnullにして System.gc()を実行する
   System.gc()メソッドは、GCを行うようにJavaVMに提案するだけ。
   JavaVMはGC処理の優先順位を高く設定するが、そのタイミングにGCするとは限らない。
×d.そのオブジェクトへの全ての参照をnullにして Runtime.gc()を実行する
   そげなメソッドなぞなかばい。


goto [J2SE1.4] INDEX

tag : SJC-P

2008-06-25 00:48 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud