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

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

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

Re[3]: C# ガーベッジコレクション


(過去ログ 28 を表示中)

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

■12897 / inTopicNo.1)  C# ガーベッジコレクション
  
□投稿者/ 鬱手前 (3回)-(2008/01/20(Sun) 15:26:43)

分類:[ASP.NET (C#)] 

C#はというか.netは?
メモリの解放などを気にしないでもいいらしいですが、
たとえばオブジェクトを生成して閉じなくても解放してくれるということですが
やはり自分でクローズやdisposeなどしたほうがパフォーマンス的にはいいのでしょうか?
C#にまかすということは適当なタイミングということでしょうか?
お願いします
引用返信 編集キー/
■12899 / inTopicNo.2)  Re[1]: C# ガーベッジコレクション
□投稿者/ Azulean (14回)-(2008/01/20(Sun) 15:57:32)
> やはり自分でクローズやdisposeなどしたほうがパフォーマンス的にはいいのでしょうか?
> たとえばオブジェクトを生成して閉じなくても解放してくれるということですが

<Dispose等の解放のメソッドが存在しないオブジェクトの場合>
マネージリソースしか扱わないオブジェクトは解放する必要がありません。
というよりも、ガベージコレクションが行われるまでは解放する方法がありません。

<Dispose等の解放のメソッドが存在しているオブジェクトの場合>
例えば、FileStream等はDisposeしなかった場合、しばらくファイルを開きっぱなしになります。
それだと、他のアプリケーションから開くことができなかったりする等の不利益が生じるため、Disposeメソッドを呼び出して明示的に解放する必要があります。


> C#にまかすということは適当なタイミングということでしょうか?
「適当」が「いい加減」という言葉に近い意味であるならばそうです。
(適当という言葉は2つの意味を持つから難儀)
基本的にDisposeを持つメソッドはDisposeしてあげるべきです。
引用返信 編集キー/
■12946 / inTopicNo.3)  Re[2]: C# ガーベッジコレクション
□投稿者/ san (8回)-(2008/01/21(Mon) 19:24:31)
No12899 (Azulean さん) に返信
>>やはり自分でクローズやdisposeなどしたほうがパフォーマンス的にはいいのでしょうか?
>>たとえばオブジェクトを生成して閉じなくても解放してくれるということですが
>
> <Dispose等の解放のメソッドが存在しないオブジェクトの場合>
> マネージリソースしか扱わないオブジェクトは解放する必要がありません。
> というよりも、ガベージコレクションが行われるまでは解放する方法がありません。
>
> <Dispose等の解放のメソッドが存在しているオブジェクトの場合>
> 例えば、FileStream等はDisposeしなかった場合、しばらくファイルを開きっぱなしになります。
> それだと、他のアプリケーションから開くことができなかったりする等の不利益が生じるため、Disposeメソッドを呼び出して明示的に解放する必要があります。
>
>
>>C#にまかすということは適当なタイミングということでしょうか?
> 「適当」が「いい加減」という言葉に近い意味であるならばそうです。
> (適当という言葉は2つの意味を持つから難儀)
> 基本的にDisposeを持つメソッドはDisposeしてあげるべきです。

私も参考にさせていただきました。
引用返信 編集キー/
■13071 / inTopicNo.4)  Re[3]: C# ガーベッジコレクション
□投稿者/ 七曜 (41回)-(2008/01/24(Thu) 03:02:53)
> >>C#にまかすということは適当なタイミングということでしょうか?
>>「適当」が「いい加減」という言葉に近い意味であるならばそうです。
>>(適当という言葉は2つの意味を持つから難儀)
>>基本的にDisposeを持つメソッドはDisposeしてあげるべきです。

基本的には、CLR(Common Language Runtime)がガベージコレクションのタイミングを制御していますので
それに任すのが"適切"です。

.NET2.0が前提であれば、Disposeが出来るものは
 [using ステートメント (C# リファレンス)]
 http://msdn2.microsoft.com/ja-jp/library/yh598w02(VS.80).aspx
を使うと便利というかコードがすっきりする場合があります。(例外発生時の解放漏れとかも防げるので。)

ちょっと細かい話になりますが、マネージドヒープはジェネレーション#0-#2までの3つに分かれていて
#0が新しく、#2が古いものが格納されています。理論上、#2は長期間参照されているものであり削除されにくい(はずな)ので
通常は#0及び#1あたりのマネージドヒープが優先的に回収されます。
しかし、サイズの大きなマネージドヒープを使用した場合は、強制的に#2に格納されるため、ガベージコレクションにより回収されづらくなる場合があります。
この場合には、
 [GC クラス]
 http://msdn2.microsoft.com/ja-jp/library/system.gc(VS.80).aspx
を使用して、ガベージコレクションを強制実行する、といった手法もあります。

まぁ、通常はCLRに任せておけば問題ありませんが、マネージドヒープの使用法によってはガベージコレクションを制御した方が良い場合もある、ということです。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -