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

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

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

Re[3]: OutOfMemoryについて


(過去ログ 82 を表示中)

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

■48565 / inTopicNo.1)  OutOfMemoryについて
  
□投稿者/ 初心者.net (1回)-(2010/04/08(Thu) 20:01:31)

分類:[VB.NET/VB2005 以降] 

いつも参考にさせていただいています。

今回初めて質問させていただきます。

開発環境が
 Visual Studio2005 VB.NET
 SQL SERVER 2005 Express

です。

あるアプリケーションを作成し、3〜4日動かしていると、
突然アプリケーションがダウンしました。

出力していたLogを見ると、

・種類 'System.OutOfMemoryException' の例外がスローされました。

と書かれていました。

OutOfMemoryに関して情報を探しているのですが、具体的に
どのような場合、もしくはコーディングをすると、
発生するエラーなのかわかりません。。。

そもそも.net配下でOutOfMemory自身が発生するのでしょうか。
ガベージコレクションの実行でメモリは解放されると認識しているのですが、、、

申し訳ありませんが、OutOfMemoryが発生する要因、コーディングの誤記述など
ご存知の方がいらっしゃれば教えてください。

宜しくお願いいたします。

引用返信 編集キー/
■48568 / inTopicNo.2)  Re[1]: OutOfMemoryについて
□投稿者/ Jitta on the way (599回)-(2010/04/08(Thu) 20:10:49)
No48565 (初心者.net さん) に返信
> いつも参考にさせていただいています。
>
> 今回初めて質問させていただきます。
>
> 開発環境が
>  Visual Studio2005 VB.NET
>  SQL SERVER 2005 Express
>
> です。
>
> あるアプリケーションを作成し、3〜4日動かしていると、
> 突然アプリケーションがダウンしました。
>
> 出力していたLogを見ると、
>
> ・種類 'System.OutOfMemoryException' の例外がスローされました。
>
> と書かれていました。
>
> OutOfMemoryに関して情報を探しているのですが、具体的に
> どのような場合、もしくはコーディングをすると、
> 発生するエラーなのかわかりません。。。
>
> そもそも.net配下でOutOfMemory自身が発生するのでしょうか。
> ガベージコレクションの実行でメモリは解放されると認識しているのですが、、、
>
> 申し訳ありませんが、OutOfMemoryが発生する要因、コーディングの誤記述など
> ご存知の方がいらっしゃれば教えてください。
>
> 宜しくお願いいたします。
>

掴んだまま(参照したまま)なら、足りなくなります。ガーベッジ コレクションは、ゴミは掃除しますが、ゴミでないものは掃除しません。(掃除されたら困る)
引用返信 編集キー/
■48582 / inTopicNo.3)  Re[2]: OutOfMemoryについて
□投稿者/ 囚人 (491回)-(2010/04/08(Thu) 22:59:54)
>開発環境が
> Visual Studio2005 VB.NET
> SQL SERVER 2005 Express


この手の問題で提示するべきなのは開発環境じゃなくて実行環境じゃないかな・・・てのはとりあえず置いといて。

よほど .NET FrameworkやCLR、自身が使用してるフレームワークなどに精通していないと、予想外の事でメモリリークする場合があります。

例えばWPFなら
http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx
のような感じです。

ですので、GCがあればメモリに関して無頓着でいてよいかというと、そうもいきません。

原因と考えられるものは山ほどあるので、他人に例を出してもらっても解決するのはかなり困難でしょう。

やはり、ありきたりですが、問題を分析・計測しどこが問題か判別するところから始めるべきです。

引用返信 編集キー/
■48593 / inTopicNo.4)  Re[3]: OutOfMemoryについて
□投稿者/ よねKEN (465回)-(2010/04/09(Fri) 09:54:47)
2010/04/09(Fri) 10:04:27 編集(投稿者)

No48565 (初心者.net さん) に返信
> OutOfMemoryに関して情報を探しているのですが、具体的に
> どのような場合、もしくはコーディングをすると、
> 発生するエラーなのかわかりません。。。

例えば、実行環境で搭載しているメモリ以上に、ガンガンにメモリを消費するプログラムを動作させると、
どこかのタイミングででOutOfMemoryExceptionの例外が発生します。
(タイミングについては、厳密にこういうタイミングです!とは説明できないのですが、
仮想メモリや他のアプリの状況などによると思います)

> そもそも.net配下でOutOfMemory自身が発生するのでしょうか。

例えば、処理のピーク時にどの程度メモリを消費するのかに無頓着だと発生します。
私の体験談ですが、開発作業上必要だった大量データ(数GB)を作成するための捨てツールで発生させたことがあります。
同時に参照しているメモリ量は多くはなかったのですが、
1メソッドの中のループで大量のインスタンスを発生させたため、
GCが働くスキを与えずに使用可能なメモリ量を超えてました。
(捨てツールなので、処理の間でときどきGC.Collectメソッドを呼び出し、不要インスタンスのお掃除を
させる対応を取りました。←業務アプリならもっと根本的な対応を行うべきところですが)

問題点・対処の方向性ついてはJittaさん、囚人さんのご指摘の通りです。
まとめると以下のような感じ。

(1) プログラムが使用するメモリがアプリの仕様上(現在の設計では)、
  使用可能なメモリ量より多い(多くなるときがある)
  → 対処:搭載メモリを増やす。同時期のメモリ消費を抑えるように再設計・チューニングを行う。

(2) アプリの仕様上はもう不要になっている参照があるが、プログラムの実装上は
  参照したままになっている。
  → 対処:プログラムのメモリ使用に無駄があるということなので、
       無駄使いしないように対処する。併せて(1)への対処も必要かもしれない。

(3) フレームワークの不具合、もしくは、フレームワークの想定する使用方法に則って実装
  していないための不具合
  → 対処:囚人さんの提示されているような情報を収集して個別に対処。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -