質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

1214閲覧

ASP.net上でアンマネージドとマネージドの必要性

mo-ri

総合スコア35

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/05/29 07:17

ASP.NET初心者です。
おひとつお伺いしたいのですが、ASP.net上では参照が終わればメモリーは解放されると認識しており、
マネージドやアンマネージドなど気にする必要性はあるのでしょうか?

明示的に指示せずとも自動で解放されるものと認識しておるのですが、間違っているでしょうか?
ご回答お願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/29 08:04

アプリケーションにおけるリークには大別してメモリリークとリソースリークがありますが、このスレッドで質問者さんが気にしているのはメモリーリークだけですか?
mo-ri

2019/05/29 08:10

メモリーリークのみです。分かりにくくてすみません。 リソースリークについてはasp.netのよっぽどの事をしない限り発生しないと考えています
退会済みユーザー

退会済みユーザー

2019/05/29 08:13

タイトルに「アンマネージドとマネージドの必要性」とありますがどういう意味ですか? 特にアンマネージドの方。質問者さんの ASP.NET Web アプリでアンマネージドリソースを使うのであれば、 .NET のガベージ コレクターは、アンマネージ メモリの割り当てや解放を行いませんので、そのリソースの開放は気にせざるを得ないということになると思いますが。
退会済みユーザー

退会済みユーザー

2019/05/29 08:19

> リソースリークについてはasp.netのよっぽどの事をしない限り発生しないと考えています そんなことはなくて、例えば SQL Server にアクセスしていて、Connection を Close してないとか、Close が書いてあっても例外が発生するとそのコードが実行されないなど、きちんと処理が書かれてないコードをよく目にしますよ。
mo-ri

2019/05/30 00:01

そういったことは無論なのですが、c99のように確保分を閉じたり、ASP.net上で書かれたDLL、win32などを用いてないDLLを利用したときに明示的に閉じたりとそういったことは必要ないとおもってたのですが、不安になりまして質問させていただいたしだいです。
退会済みユーザー

退会済みユーザー

2019/05/30 00:19

「そういったこと」とは何を指してますか? どれはともかく、回答を読んでもらったでしょうか? 読んで不明な点があれば、回答のコメント欄に書いてください。 あと、.net dispose などをキーワードにググると、cg 任せにするのは NG ということを書いた記事がいろいろヒットするので、読んでみることをお勧めします。
guest

回答1

0

ベストアンサー

上の質問に対するコメントに返事がありませんが、

(1) このスレッドで質問者さんが気にしているのはメモリーリークだけ

(2) 使うのは ASP.NET 用に Microsoft が提供している .NET のライブラリだけ(アンマネージドリソースを使う、例えば Office オートメーションを利用して Excel ファイルを作るなどはしない)

・・・ということでレスします。

基本的に、IDisposable インターフェイス を継承して Dispose メソッドを実装しているクラスは、そのオブジェクトが使用されなくなった時点で Dispose メソッドを呼び出すということで良いと思います。

以下の記事に "マネージ リソース (配列など) のみを使用する型は、ガベージ コレクターによって自動的にクリアされるため、このような型で Dispose メソッドを実装しても、パフォーマンス上の利点はありません" と書いてありますが、逆に言えばライブラリに Dispose メソッドが実装してあるということは、内部でアンマネージドリソースを使っているかもしれません。

Dispose メソッドの実装
https://docs.microsoft.com/ja-jp/previous-versions/dotnet/netframework-4.0/fs2xkftw(v=vs.100)

また、"Dispose メソッドは、破棄するオブジェクトの SuppressFinalize メソッドを呼び出す必要があります。 SuppressFinalize を呼び出すと、オブジェクトが終了キューに置かれている場合は、そのオブジェクトの Finalize メソッドの呼び出しは行われません。Finalize メソッドの実行は、パフォーマンスに影響を与えることを覚えておいてください。" ということもあるそうです。

ただ、クラスによってはコンストラクタに GC.SuppressFinalize メソッドが実装されており、冗長な Finalize メソッドの呼び出しを防ぐという意味では Dispose() メソッドを呼ぶ必要はないものもありますが。

それでも Dispose メソッドを実装しているクラスは、そのオブジェクトが使用されなくなった時点で Dispose メソッドを呼び出す(または using 句を使う)ことを基本にした方がよさそうです。

投稿2019/05/29 09:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mo-ri

2019/05/30 00:17

ご回答ありがとうございます。 昨日ガベージコレクションを見ながらいろいろ試して気づいたのですが、ASP.NET上ではあらかじめメモリーが確保してあり、OS側からみて常に一定のメモリー量は確保されているようですね。 ASP.NET上メモリーを気にするの必要性は無いと私個人的にはおもいました。c99ばっかりだったので気になったしだいでした。ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/05/30 00:25

上の回答を理解してもらってますか? CG 任せにして Dispose しないと言うのは NG なんですよ。 .net dispose などをキーワードにググってください。NG だという理由を説明する記事が多々ヒットするので読んでください。
mo-ri

2019/05/30 00:27

NET Framework 上で管理されてるものであればよいのではないのでしょうか??? DLLに関してもwin32などを使用しない.net上の物しか使わなければ、わざわざ明示的に開放しなくてよいと理解してるのですが間違っていますか?
退会済みユーザー

退会済みユーザー

2019/05/30 00:30

あと、GC は ASP.NET 固有の話ではなく、.NET Framework 全般の話です。Windows Forms, WPF アプリでも CG は働きます。
退会済みユーザー

退会済みユーザー

2019/05/30 00:32

Dispose は使ってください。使わないのは間違ってます。
mo-ri

2019/05/30 00:49

すみません全然理解できないです。.NET Framework はメモリー管理をしなくてもよいと公式のドキュメントにも記載してあるのですが、、、 Disposeは特別な状況のみで使用すべきですと記載してあり、 【ネイティブ コードを記述する場合は、Win32 関数を使用して仮想アドレス空間を操作します。 ネイティブ ヒープの仮想メモリの割り当てと解放はこれらの関数によって行われます。】 と公式ドキュメントにあるのですが、つまりwin32など利用しなければ.net Frameworkがやりますよっと理解してるのですが、間違いなのですか?
退会済みユーザー

退会済みユーザー

2019/05/30 01:27

> すみません全然理解できないです。.NET Framework はメモリー管理をしなくてもよいと公式のドキュメントにも記載してあるのですが、、、 Microsoft が提供する.NET のライブラリに限っても、使われているのは必ずしも 100% マネージドリソースという訳ではなく、アンマネージドリソースも使っているケースもあるはずです。 そういう場合は、IDisposable インターフェイスを継承して Dispose パターンを使った実装がされていて、 Dispose メソッドでアンマネージドリソースを開放できるようになっているはずです。 なので、回答にも書きましたが、IDisposable インターフェイス を継承して Dispose メソッドを実装しているクラスは、そのオブジェクトが使用されなくなった時点で Dispose メソッドを呼び出すべきなのです。 回答を読んでもらっているでしょうか? コメントで書いたように、.net dispose などをキーワードにググって、CG 任せにするのは NG だという理由を説明する記事を読んでもらってますか?
退会済みユーザー

退会済みユーザー

2019/05/30 01:46

回答に、 > (1) このスレッドで質問者さんが気にしているのはメモリーリークだけ と書いたときに補足しておけばよかったですが、メモリーリークだけでなくリソースリークにも着目すると Dispose するべきという話がピンとくるかもしれません。以下の記事の「メモリの解放とオブジェクトの破棄との混同」のセクションのあたりを見てもらうと上で言っている意味が分かるのではないかと思います。 C# のファイナライザ、Dispose() メソッド、IDisposable インターフェースについて https://qiita.com/Zuishin/items/9efc9c8cbb98300bbc64
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問