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

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

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

Re[4]: .NET Framework の自動メモリ管理について


(過去ログ 39 を表示中)

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

■20392 / inTopicNo.1)  .NET Framework の自動メモリ管理について
  
□投稿者/ じゅで (25回)-(2008/06/10(Tue) 12:25:59)

分類:[.NET 全般] 

いつもお世話になっております。
じゅでです。

今回の質問は、ガベージコレクションによる、自動メモリ管理についてとります。

本来ならば、.NETの開発者は、メモリ管理を自分自身で行わずにガベージコレクションによる
メモリ管理に全て一任していると思われます。

しかしながら、現在の開発で、そのような事をご存じない方が、技術的な提案をする
PLとして存在しており、摩訶不思議な仕様が出てきております。

PLが言うには、アプリケーションで使用している、クラスのインスタンスが存在したままになると、
メモリを圧迫するから、使ったらすぐに破棄しようといっております。

しかしながら、そのクラスは、以下のようなつくりになっております。

public class DBへのアクセスクラス
{
private DBデータ格納クラス _dbValue;

public DBデータ格納クラス DbValue
{
get{ return DbValue; }
}
}

public class DBデータ格納クラス
{
private string _name;

public string Name
{
get{ return _name; }
set{ _name = value; }
}
}

最後にDBへのアクセスクラスをとあるクラスが使用しています。
その時に、とあるクラスがDBデータ格納クラスを使用する場合に、
このような感じで使用します。

// _dbAccesserはクラスのフィールドだと思ってください。
DBへのアクセスクラス _dbAccesser = new DBへのアクセスクラス();

DBデータ格納クラス hoge = _dbAccesser.DBデータ格納クラス

そして、このhogeをすぐに破棄すると言っています。

ちなみにDBへのアクセスクラスは、とあるクラスがずぅ〜っと保持し続けます。
WeakReferenceなどは、一切使用していないです。

ここでお聞きしたいのが、以下の点です。

1. そもそも.NETプログラムではGCを使用して、明示的にガベージコレクタを走らせる
事は可能となっておりますが、参照を消しただけでは、ガベージコレクタがすぐに
動作するわけではないので、意味がないと言う事を、証明するソースの作成方法。

2. そもそも、_dbAccesserの中で参照していて、参照が残ってるんだから意味
がないじゃんと言う事を、やんわり伝えてあげる方法・・・orz
(これがディープコピーで、オブジェクトのインスタンスを新しく生成しているなら、
まだ、多少理解が出来ますが・・・そんな事もしてないです。)

とりあえず、その他の説明資料は、以下のような物を想定していますが、
やはりソースがあったほうが、説得力があると言う事で、質問をあげさせていただきました。

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

以上となります。
引用返信 編集キー/
■20401 / inTopicNo.2)  Re[1]: .NET Framework の自動メモリ管理について
□投稿者/ ネタ好き (414回)-(2008/06/10(Tue) 14:04:49)
No20392 (じゅで さん) に返信
1についてはSystem.GCクラスを使用したサンプルプログラムは如何でしょうか?
GCの回収はCollectメソッドで出来ますから、GetTotalMemoryメソッドを使用して、
Collectメソッド使用前と使用後のメモリ量を表示して見せれば説得できるかもしれません。
引用返信 編集キー/
■20415 / inTopicNo.3)  Re[2]: .NET Framework の自動メモリ管理について
□投稿者/ じゅで (26回)-(2008/06/10(Tue) 15:18:00)
返信ありがとうございます。

> GCの回収はCollectメソッドで出来ますから、GetTotalMemoryメソッドを使用して、
> Collectメソッド使用前と使用後のメモリ量を表示して見せれば説得できるかもしれません。

一番最初にGetTotalMemoryも考えたのですが、必ずしも正しい値が返ってこないので、
皆さんどうしているのかなと思いまして。

http://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html
http://msdn.microsoft.com/ja-jp/library/system.gc.gettotalmemory(VS.80).aspx


現在割り当てられていると思われるバイト数を取得します。

戻り値
マネージ メモリに現在割り当てられているバイト数の近似値を表す数値。


何か方法があるのであれば、近似値じゃなく、正確な値がとれるかなと。
引用返信 編集キー/
■20416 / inTopicNo.4)  Re[2]: .NET Framework の自動メモリ管理について
□投稿者/ やじゅ (446回)-(2008/06/10(Tue) 15:18:26)
2008/06/10(Tue) 18:41:15 編集(投稿者)

> ■No20392 (じゅで さん) に返信

デモを見せる
http://download.microsoft.com/download/6/9/c/69c09c8a-810b-46c8-b61e-79c4339ea47e/T5-407.ppt

Process Explorer でメモリ状態を提示する
http://www.forest.impress.co.jp/lib/sys/wincust/taskservice/prcsxplorer.html

#追記
CLR プロファイラの使用方法
http://www.microsoft.com/japan/msdn/enterprise/pag/scalenethowto13.aspx
引用返信 編集キー/
■20419 / inTopicNo.5)  Re[3]: .NET Framework の自動メモリ管理について
□投稿者/ ネタ好き (419回)-(2008/06/10(Tue) 15:25:26)
正確な値を取得したい場合は、アンマネージのICorProfilerCallback2とかに在った様な・・・

引用返信 編集キー/
■20420 / inTopicNo.6)  Re[3]: .NET Framework の自動メモリ管理について
□投稿者/ じゅで (27回)-(2008/06/10(Tue) 15:27:55)
返信ありがとうございます。

> デモを見せる
> http://download.microsoft.com/download/6/9/c/69c09c8a-810b-46c8-b61e-79c4339ea47e/T5-407.ppt
>
> Process Explorer でメモリ状態を提示する
> http://www.forest.impress.co.jp/lib/sys/wincust/taskservice/prcsxplorer.html

なるほど、デモという手が、この資料非常によかったです。
これをこのまま渡した方がはやそうだ・・・orz

Process Explorerもありですね。
お手軽です。

まだまだ、ご意見はお待ちしております。
明日までに何とかできればいいので。


引用返信 編集キー/
■20421 / inTopicNo.7)  Re[4]: .NET Framework の自動メモリ管理について
□投稿者/ じゅで (28回)-(2008/06/10(Tue) 15:30:11)
2008/06/10(Tue) 15:30:44 編集(投稿者)

No20419 (ネタ好き さん) に返信
> 正確な値を取得したい場合は、アンマネージのICorProfilerCallback2とかに在った様な・・・
>

なんと、ありがとうございます。
早速調べてみます。

本当に、感謝です。

ご返答くださったお二方に感謝です。
本当にありがとうございました。


# 追記
解決済み入れ忘れorz
解決済み
引用返信 編集キー/
■20423 / inTopicNo.8)  Re[4]: .NET Framework の自動メモリ管理
□投稿者/ ネタ好き (420回)-(2008/06/10(Tue) 15:31:42)
2008/06/10(Tue) 15:32:42 編集(投稿者)

PLさんはどの程度の技術を理解しているのでしょうか?
PLさんの性格や能力が分かれば説得する効率的な方法も見つかるかもしれません。

追記
ごめん、解決済みになっている事気付かず書いてしまった。
気にしないでね。
解決済み
引用返信 編集キー/
■20426 / inTopicNo.9)  Re[5]: .NET Framework の自動メモリ管理
□投稿者/ じゅで (29回)-(2008/06/10(Tue) 15:40:55)
2008/06/10(Tue) 16:15:40 編集(投稿者)
2008/06/10(Tue) 15:50:21 編集(投稿者)

> PLさんはどの程度の技術を理解しているのでしょうか?
> PLさんの性格や能力が分かれば説得する効率的な方法も見つかるかもしれません。

VB.NETってVB6.0と同じだよね♪
クラスって何?おいしいの?

こんなレベルだと思っていただいて、ほぼ間違いないですorz

けどプライドはむちゃくちゃ高いです。


> 追記
> ごめん、解決済みになっている事気付かず書いてしまった。
> 気にしないでね。

いえいえ、今まだ資料をあさっているところで、今のところちんぷんかんぷんですので、
とりあえず、進展がありましたら、ご連絡を。

# 私がまた解決済みを入れ忘れました。申し訳ないですorz

さて、プロファイラを色々調べましたが・・・あれを今から自作するのは、
時間的に無理が・・・orz
と言う事で、無料プロファイラを探したところいくつか該当するものが
あがってきましたが、いかんせんうまく動いてくれないorz
(というか、すいません、CLRProfilerの存在を完全に忘れてました・・・)

と言う事で、GetTotalMemoryをとりあえず使っておきます。

お二方に感謝です。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -