C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[17]: ガベージコレクションについて [1]


(過去ログ 51 を表示中)

[トピック内 37 記事 (21 - 37 表示)]  << 0 | 1 >>

■28361 / inTopicNo.21)  Re[12]: ガベージコレクションについて
  
□投稿者/ .SHO (157回)-(2008/11/25(Tue) 11:56:16)
No28359 (なちゃ さん) に返信

> 明示的にGCを起こしたり

これってできるんですか?知らなかった。。。
是非、やり方教えてください。

引用返信 編集キー/
■28362 / inTopicNo.22)  Re[13]: ガベージコレクションについて
□投稿者/ nori (35回)-(2008/11/25(Tue) 12:19:34)
>たとえば、Formのコンストラクタの中で
>MainMenu menu = new MainMenu();
>this.Menu = menu;
>として作成したメニューは、いずれGCによって回収され壊れてしまうのでしょうか?
>実際はそんなことはなく、問題なく動きます。
this.Menu = menu;
この一文でFormから参照される事になるのでGC対象外になります。

>明示的にGCを起こしたり
GC.Collect
です。
引用返信 編集キー/
■28363 / inTopicNo.23)  Re[11]: ガベージコレクションについて
□投稿者/ .SHO (158回)-(2008/11/25(Tue) 12:23:52)
No28360 (.SHO さん) に返信

> たとえば、Formのコンストラクタの中で
> MainMenu menu = new MainMenu();
> this.Menu = menu;
> として作成したメニューは、いずれGCによって回収され
> 壊れてしまうのでしょうか?
> 実際はそんなことはなく、問題なく動きます。

そうか、IDEのデザイナで画面作ってると、メニューだのツールバーだのって
全部Auto変数にはならないから、普段こんな事を意識しないんですね。

確かにメニューとかは処理によっては動的に変更される可能性があるので
IDEの実装としてはそれでいいのですが、メニューなんて1度初期化したら
あとは変更しないことが多いので、私はいつもAuto変数にしてます。

引用返信 編集キー/
■28365 / inTopicNo.24)  Re[14]: ガベージコレクションについて
□投稿者/ .SHO (159回)-(2008/11/25(Tue) 12:48:39)
No28362 (nori さん) に返信

> this.Menu = menu;
> この一文でFormから参照される事になるのでGC対象外になります。

なるほど。だから、タイマーなんですね。

> >明示的にGCを起こしたり
> GC.Collect
> です。

こんなの作ってみました↓

using System;
using System.Windows.Forms;

public class form : Form {
  public form() {
    System.Timers.Timer timer1 = new System.Timers.Timer( 120000 );
    timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed1);
    timer1.AutoReset = true;
    timer1.Start();

    System.Timers.Timer timer2 = new System.Timers.Timer( 1000 );
    timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed2);
    timer2.AutoReset = true;
    timer2.Start();
  }

  void timer_Elapsed1( object sender, System.Timers.ElapsedEventArgs e ) {
    Console.WriteLine( DateTime.Now );
  }

  void timer_Elapsed2( object sender, System.Timers.ElapsedEventArgs e ) {
    GC.Collect();
    Console.Write( "*" );
  }

  static void Main() { Application.Run( new form() ); }
}

とりあえず、まだ5分ぐらいですが問題なく動き続けてます。

引用返信 編集キー/
■28367 / inTopicNo.25)  Re[11]: ガベージコレクションについて
□投稿者/ 渋木宏明(ひどり) (960回)-(2008/11/25(Tue) 12:55:23)
渋木宏明(ひどり) さんの Web サイト
>>であっても、何かを証明したことにはならないでよね。
>
> 完全な証明でないことはわかってますが、1時間も動かせば必要十分な証明だと思います。
> 100秒、200秒の世界の話をしているわけですから。

「証明するはずだったこと」が証明されてないと思います。

System.Threading.Timer がユーザコード上で参照を失っても生存し続けているのは CLR がどうにかしてくれているわけではなく、System.Threading.Timer に固有の実装(の工夫う?)によるものだという話です。

「System.Threading.Timer さえ生き残ってくれればそれでいい」ということなら、特に異議は唱えません。

一般論として、「マネージヒープ上に確保されたメモリ以外の資源も GC が管理してくれるので、プログラマは資源管理に配慮する必要はない」という展開になっているように思えたので「違う」と指摘しました。
引用返信 編集キー/
■28370 / inTopicNo.26)  Re[12]: ガベージコレクションについて
□投稿者/ .SHO (161回)-(2008/11/25(Tue) 13:10:06)
No28367 (渋木宏明(ひどり) さん) に返信

> System.Threading.Timer がユーザコード上で参照を失っても生存し続けているのは CLR がどうにかしてくれているわけではなく、System.Threading.Timer に固有の実装(の工夫う?)によるものだという話です。
>
> 「System.Threading.Timer さえ生き残ってくれればそれでいい」ということなら、特に異議は唱えません。
>
> 一般論として、「マネージヒープ上に確保されたメモリ以外の資源も GC が管理してくれるので、プログラマは資源管理に配慮する必要はない」という展開になっているように思えたので「違う」と指摘しました。

了解です。
私の横暴な発言で一般論にまで発展してしまったことは申し訳ありませんでした。

一般論は除いて、最初の質問のコードに関しては System.Threading.Timer に固有の実装(の工夫う?)
によって GC に回収されることはなく、問題なく動作するということでバグはないですよね。

ということで No28365 の実験も動いて当然で、意味がないのでもう止めます。
ちなみにこれも1時間近く問題なく動作しました。
引用返信 編集キー/
■28372 / inTopicNo.27)  Re[13]: ガベージコレクションについて
□投稿者/ .SHO (162回)-(2008/11/25(Tue) 13:19:43)
> 一般論は除いて、最初の質問のコードに関しては System.Threading.Timer に固有の実装(の工夫う?)
> によって GC に回収されることはなく、問題なく動作するということでバグはないですよね。

これ、System.Threading.Timer じゃなくて System.Windows.Forms.Timer ですね。。。
引用返信 編集キー/
■28382 / inTopicNo.28)  Re[13]: ガベージコレクションについて
□投稿者/ 渋木宏明(ひどり) (961回)-(2008/11/25(Tue) 14:31:27)
渋木宏明(ひどり) さんの Web サイト
> 一般論は除いて、最初の質問のコードに関しては System.Threading.Timer に固有の実装(の工夫う?)
> によって GC に回収されることはなく、問題なく動作するということでバグはないですよね。

僕は確認してませんが、そのようですね。

引用返信 編集キー/
■28391 / inTopicNo.29)  Re[14]: ガベージコレクションについて
□投稿者/ .SHO (170回)-(2008/11/25(Tue) 15:53:24)
2008/11/25(Tue) 15:55:42 編集(投稿者)
No28382 (渋木宏明(ひどり) さん) に返信

> 僕は確認してませんが、そのようですね。

すっきりしました!


ちなみに System.Threading.Timer の方も実験してみましたが
こちらは当然ダメでした。

using System;
using System.Threading;

public class form : System.Windows.Forms.Form {
  public form() {
    TimerCallback e1 = new TimerCallback( elapsed1 );
    TimerCallback e2 = new TimerCallback( elapsed2 );
    Timer timer1 = new Timer( e1, null, 120000, 120000 );
    Timer timer2 = new Timer( e2, null,   1000,   1000 );
  }

  void elapsed1( Object s ) { Console.WriteLine( DateTime.Now ); }
  void elapsed2( Object s ) { GC.Collect(); Console.Write( "*" ); }

  static void Main() { System.Windows.Forms.Application.Run( new form() ); }
}

は、「*」を1個表示して止まりました。


using System;
using System.Threading;

public class form : System.Windows.Forms.Form {
  static TimerCallback e1 = new TimerCallback( elapsed1 );
  static TimerCallback e2 = new TimerCallback( elapsed2 );
  Timer timer1 = new Timer( e1, null, 120000, 120000 );
  Timer timer2 = new Timer( e2, null,   1000,   1000 );

  static void elapsed1( Object s ) { Console.WriteLine( DateTime.Now ); }
  static void elapsed2( Object s ) { GC.Collect(); Console.Write( "*" ); }

  static void Main() { System.Windows.Forms.Application.Run( new form() ); }
}

に修正すれば、当然問題なく動いています。

引用返信 編集キー/
■28399 / inTopicNo.30)  Re[11]: ガベージコレクションについて
□投稿者/ .SHO (172回)-(2008/11/25(Tue) 21:00:48)
No28285 (NyaRuRu さん) に返信

> 以前 System.Windows.Forms.Timer (今回問題になっている System.Timers.Timer ではない) のソースを確かめてみたら,タイマを有効にしている間は GCHandle で自分自身をルート参照に加えていました.

sscli20 をダウンロードしたのですが、System.threading.timer のソースはあるのですが
System.Windows.Forms.Timer のソースが見当たりません。
Systemフォルダの下にWindowsフォルダがありません。

これは sscli20 フォルダで buildall すると作られものなんでしょうか?
それとも、また別のところで公開されているのですか?

build がどうしても失敗するので嫌になってきました^^;
とりあえず、ちゃんとbuild出来れば作られるものなのかだけでも確認したかったもので。
引用返信 編集キー/
■28406 / inTopicNo.31)  Re[15]: ガベージコレクションについて
□投稿者/ nori (36回)-(2008/11/25(Tue) 23:08:38)
>Systemフォルダの下にWindowsフォルダがありません。
IDEで落とすか、NetMassDownloaderで落とせます。

http://www.codeplex.com/NetMassDownloader
引用返信 編集キー/
■28408 / inTopicNo.32)  Re[16]: ガベージコレクションについて
□投稿者/ Azulean (233回)-(2008/11/25(Tue) 23:56:31)
ここからまとめて落とせるようになっていますよね。
http://referencesource.microsoft.com/downloadsetup.aspx
引用返信 編集キー/
■28411 / inTopicNo.33)  Re[16]: ガベージコレクションについて
□投稿者/ chobi (4回)-(2008/11/26(Wed) 01:14:00)
GCは難しいのであまり良く分かっていませんが・・・

System.Threading.Timer --> Finalizeメソッドなし(直ぐ回収される)
System.Timers.Timer --> Finalizeメソッドあり (複数回のGC起動が必要)
System.Windows.Forms.Timer --> Finalizeメソッドあり (複数回のGC起動が必要)

GCの起動条件とFinalizeメソッドあり、なしでのGCの動作の違いは下記参照

http://www.microsoft.com/japan/msdn/net/mag00/GCI.aspx
http://www.microsoft.com/japan/msdn/net/mag00/GCI2.aspx

この辺りを議論しているのでしょうか?
引用返信 編集キー/
■28419 / inTopicNo.34)  Re[17]: ガベージコレクションについて
□投稿者/ なちゃ (212回)-(2008/11/26(Wed) 09:43:36)
ちょっと違います。
インスタンスを自分で保持しとかないといけないか、それともライブラリ側で自動的に面倒見てくれるか、です。

System.Threading.Timerは見てくれない。ドキュメントにも明記。
System.Windows.Forms.Timerは見てくれる。ドキュメントでは確か特に触れず。
System.Timers.Timerは自分自身では見てないが、内部動作上実質的に解放はされない模様。ドキュメントには特に記述なし。仕様かどうかはよく分からない。

引用返信 編集キー/
■28421 / inTopicNo.35)  Re[18]: ガベージコレクションについて
□投稿者/ Hongliang (318回)-(2008/11/26(Wed) 10:00:51)
> System.Windows.Forms.Timerは見てくれる。ドキュメントでは確か特に触れず。
Enabled プロパティに記述があります。
// クラスの解説に書いて欲しいもんだ。
引用返信 編集キー/
■28446 / inTopicNo.36)  Re[16]: ガベージコレクションについて
□投稿者/ .SHO (181回)-(2008/11/26(Wed) 12:25:14)
No28406 (nori さん) に返信
No28408 (Azulean さん) に返信

> IDEで落とすか、NetMassDownloaderで落とせます。
> http://www.codeplex.com/NetMassDownloader

> ここからまとめて落とせるようになっていますよね。
> http://referencesource.microsoft.com/downloadsetup.aspx

情報ありがとうございます。

落とすまでは出来たのですが、IDEでどう読めばいいのか?
Express Edition じゃダメなのかな?
ちょっとこれに時間かけ過ぎたので、いったん諦めます。
ありがとうございました。
引用返信 編集キー/
■28505 / inTopicNo.37)  Re[17]: ガベージコレクションについて
□投稿者/ .SHO (193回)-(2008/11/27(Thu) 10:37:18)
解決済みにしておきます。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -