- PR -

ガベージコレクションの対象となるタイミングについて

投稿者投稿内容
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-11-17 12:36
午前中試験を受けてきました。かろうじて合格でした。

しかし、ここのスレッドの問題2と同じ問いがでて結局わけのわからぬまま
とりあえず、b[0] = nullに相当する部分の直後と解答しました。
うーん、これって正解なんでしょうか・・・。とりあえず、
問題2を作成した会社への問合せ結果を待ってみます。

(尚、試験問題では String型のオブジェクトではなくて
Float型のオブジェクトへの参照となっておりました。)
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-11-17 13:09
この正解はあっています。(と思います。ちがっていたらすいません。)変数が自分のプログラムのどこに配置されるのか、同じ値が入っていても、変数を参照しに行く形になるので、同じオブジェクトとはいいがたいところがあります。ひとつひとつのオブジェクトをメモリのどこに配置されていて、その配置を見に行っているのかいないのかを追っていけば、おのずとたどり着くのではと思います。ガーベッジのことと、変数のことが入り乱れていると思います。JAVAではこのガーベッジコレクションでどうのこうのといった不具合はあまりありえないと思われ、Cや、実際にメモリを制御するようなプログラムを書くときに時々気をつけなければならない部分なので、私も試験を昔受けたときに、こんな問題がでていて、JAVAでも必要あるのかな?なんて、思ったことがありました。まぁ、試験に受かればOKですね。おめでとうございます。
R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 2003-11-17 13:27
こんにちは、R-55です。

begoodさんの説明が少し理解できなかったので僕も絶対の自信があるわけではないのですが、
実際に a = null; の後も b[0]のオブジェクトは"ABC"のままなんですよね。
このオブジェクトを後で使用する必要があったとしてGCで回収されちゃったらこまると思うんですが。
なにか勘違いしてますでしょうか。
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2003-11-17 13:54
私も認定試験合格者ですが……ここまで変な問題出題されましたっけ?
#いや、もう忘れかけてはいるんですが。
ますます資格の価値がなくなってしまうような、いいかげんな問題ですね。とほほ。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2003-11-17 14:26
まずは、合格おめでとうございます。その調子でこれからも精進してください。
偉そうに書いてますが私もまだまだ勉強することだらけです。

引用:

忍者鳥取県さんの書き込み (2003-11-14 19:49) より:

ちなみにびしばしさんは、どのような点が腑に落ちないのでしょうか?
宜しければ、びしばしさんの意見もお聞かせください。



件のサイトで問題と解説を見てきました。
それによると「bは間接参照しているだけだからaの値が変わるとbの参照先も変わる」とあります。
が実際には間接参照になっていないのではないか、というのが「腑に落ちない」点です。

b[0] = a;

の解釈が、彼らによると

b[0] --(参照)-> a --(参照)-> "ABC"

ということになるらしいのですが、私(ほか腑に落ちない皆さん)は

b[0] --(参照)-> "ABC"

となると思っています。皆さんの環境では以下のコードの出力結果はどうなりますか。

コード:
public class Test {
  public static void main(String[] args){
    String a = "ABC";
    String[] b = new String[1];

    b[0] = a;
    System.out.println("b[0] = " + b[0]);

    a = "DEF";
    System.out.println("b[0] = " + b[0]);

    b[0] = "GHI";
    System.out.println("b[0] = " + b[0]);
  }
}

taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2003-11-17 16:27
合格おめでとうございます。

JDK1.1.8(win2000Pro)では、以下の結果でした。
b[0] = ABC
b[0] = ABC
b[0] = GHI

私も「"ABC"自体はガーベッジされない」に一票なのですが……、
勘違いしてたらすみません。
swat
常連さん
会議室デビュー日: 2002/03/21
投稿数: 33
お住まい・勤務地: 埼玉県
投稿日時: 2003-11-17 16:31
引用:

びしばしさんの書き込み (2003-11-17 14:26) より:

件のサイトで問題と解説を見てきました。
それによると「bは間接参照しているだけだからaの値が変わるとbの参照先も変わる」とあります。
が実際には間接参照になっていないのではないか、というのが「腑に落ちない」点です。

b[0] = a;

の解釈が、彼らによると

b[0] --(参照)-> a --(参照)-> "ABC"

ということになるらしいのですが、私(ほか腑に落ちない皆さん)は

b[0] --(参照)-> "ABC"

となると思っています。



swatです。

私も腑に落ちない一人です。
Javaって、インスタンスへの参照を参照で渡すことってないはずです。
「参照の値渡し」だと思っていたのですが。
_________________
****** swat ******
http://www.h7.dion.ne.jp/~s_wat/
http://d.hatena.ne.jp/swat/
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-11-17 17:50
私も腑に落ちません。
というか明らかに間違ってますよね?

忍者鳥取県氏のデバッガでのチェックでも明らかですし、
以下のようなプログラムでも、およそチェックできます。

コード:
public class Test {
   public static void main(String[] args) throws Exception {
      
      Object b[] = new Object[1];

      Object a = new Object() {
         protected void finalize() throws Throwable {
            System.out.println("finalized!");
         }
      };
      
      b[0] = a;
      
      a = null;

      System.out.println("a = null;");      
      System.gc();
      
      b[0] = null;

      System.out.println("b[0] = null;");      
      System.gc();
      
      System.out.print("bye");
   }
}


# System.gc()の信頼性とか、finalizeが呼ばれたこととGC対象になったことは
# 同値ではないとか突込みどころはありますが...

スキルアップ/キャリアアップ(JOB@IT)