DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メモリ参照エラー

  • 題名: メモリ参照エラー
  • 著者: ソルヴィン
  • 日時: 2007/02/28 11:54:02
  • ID: 19194
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WinXP VB.NET2005]
分類:[.NET]

vb.netで作成したアプリケーションをある程度の長時間動作させていると何らかの操作の後に「メモリ参照エラー」が発生することがあります。
私は詳しくないのですが、メモリリークが原因になっていることがあるとか。

たとえば Redimで配列領域を確保したような場合、不要になった時点でErase(でしたっけ?)でメモリを解放する必要があるのでしょうか?

よろしくお願いします。
> vb.netで作成したアプリケーションをある程度の長時間動作させていると何らかの操作の後に「メモリ参照エラー」が発生することがあります。

現象は、VB.NET で作成した「どの」アプリケーションでも発生しますか?

また、別のPCでも発生するでしょうか?発生するとして、頻度や発生までの時間は概ね同じでしょうか?

> 私は詳しくないのですが、メモリリークが原因になっていることがあるとか。

「メモリ参照エラー」の一語から推定できるものではありません。

> たとえば Redimで配列領域を確保したような場合、不要になった時点でErase(でしたっけ?)でメモリを解放する必要があるのでしょうか?

ありません。
>渋木宏明さま

ご回答くださいましてありがとうございます。

> 現象は、VB.NET で作成した「どの」アプリケーションでも発生しますか?

実は初めてのプログラムなので当然今回のだけということになります。
もともとはVB6をずっとやってきたのですが、VB.NETに関してはよくわからないというのが本当のところです。

> また、別のPCでも発生するでしょうか?発生するとして、頻度や発生までの時間は概ね同じでしょうか?

どのPCでも発生します。
正確に把握はしていませんが、たとえば20〜30分程度動作させていて出たりします。
頻度もおおむね同じような状況です。

私の作成したプログラムということではなく、メモリ参照エラーが発生する要因として、一般的に考えられるものはあるのでしょうか?
ありましたらお教えくださいますようお願いします。
> ありません。
渋木宏明(ひどり)さま。(こど。です。いつもお世話になってます。)
変なとこにぶら下がって申し訳ないですが、なぜ、必要ありません、なのでしょうか。
不要になってるのにEraseさせない理由がわからないのですが。
単に、放置してもアプリケーション終了時には解放されるから(ばかでかくなければ)
放置しておいても大丈夫、との意味合いでしょうか?
  • 題名: Re[3]: メモリ参照エラー
  • 著者: はいこーん
  • 日時: 2007/02/28 20:10:26
  • ID: 19198
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No19197に返信(こど。さんの記事)
> > ありません。
> 渋木宏明(ひどり)さま。(こど。です。いつもお世話になってます。)
> 変なとこにぶら下がって申し訳ないですが、なぜ、必要ありません、なのでしょうか。
> 不要になってるのにEraseさせない理由がわからないのですが。
> 単に、放置してもアプリケーション終了時には解放されるから(ばかでかくなければ)
> 放置しておいても大丈夫、との意味合いでしょうか?
何の配列かわからないので、何とも言えないですね。
ローカルなものであれば不要ですが。
(
 あ、はいこーんさん、どうも〜。
 > ローカルなものであれば不要ですが。
 そりゃそうですよね。
)
■No19197に返信(こど。さんの記事)
> 不要になってるのにEraseさせない理由がわからないのですが。
> 単に、放置してもアプリケーション終了時には解放されるから(ばかでかくなければ)
> 放置しておいても大丈夫、との意味合いでしょうか?

# 上級者のこど。さんにこんなことを言うのは恐縮なのですが、

Erase ステートメントは、Nothing で参照を解放しているのと同義ですから、
「意味がない」 という意味で言っているのではないかと思いました。

ちなみに今回の本題 「メモリ参照エラー」 とは、関連はないと思います。

■No19196に返信(ソルヴィンさんの記事)
> 私の作成したプログラムということではなく、メモリ参照エラーが発生する要因として、一般的に考えられるものはあるのでしょうか?

VB からとなると通常はありえないですね。

データ プロバイダや何かしらの外部コンポーネントは使われていますか?
それらが原因であることがあります。
2007/02/28(Wed) 22:55:25 編集(投稿者)

> 変なとこにぶら下がって申し訳ないですが、なぜ、必要ありません、なのでしょうか。

ごめんなさい、配列自体の参照が無くなる場合を言っているのかと思い込んでました。
(
 じゃんぬねっとさん、渋木宏明(ひどり)さん、ありがとうございます。
)

本題の方ですが、
> 私の作成したプログラムということではなく、メモリ参照エラーが発生する要因として、一般的に考えられるものはあるのでしょうか?
普通に組んでて発生したことは今までありませんねぇ。
何でしょう?
あでも、SQLServerとのコネクションは明示的に「Dispose」しないと
再利用されないWaitingコネクションが増えてSQLServerの挙動がおかしくなったことは何度かあります。(メモリ参照エラー、というわけではないのですが。)

今のところ、コードが原因では、とは思いますが、何とも言えません。
>みなさん

貴重なご意見、ありがとうございます。

> データ プロバイダや何かしらの外部コンポーネントは使われていますか?
> それらが原因であることがあります。

外部コンポーネントというのでしょうか。
よくわからないのですが「Flash9.ocx」を使っています。
Flashファイルを表示するというのがほとんどのアプリケーションなので。

これが原因でしょうか?
■No19228に返信(ソルヴィンさんの記事)
> 外部コンポーネントというのでしょうか。
> よくわからないのですが「Flash9.ocx」を使っています。
> Flashファイルを表示するというのがほとんどのアプリケーションなので。
>
> これが原因でしょうか?

リモートでデバッグできる場所にいるわけではないのですから、ご自身で調べないとどうしようもありません。
怪しいと思うところがあろうとなかろうと、「問題の切り分け」 はできるでしょう。

デバッグの基本は 「問題の切り分け」 です。
原因がわからないものは、ミニマム コードを狭めていくことで場所をまず特定するのが基本です。
>>これが原因でしょうか?
>
> リモートでデバッグできる場所にいるわけではないのですから、ご自身で調べないとどうしようもありません。
> 怪しいと思うところがあろうとなかろうと、「問題の切り分け」 はできるでしょう。
>
> デバッグの基本は 「問題の切り分け」 です。
> 原因がわからないものは、ミニマム コードを狭めていくことで場所をまず特定するのが基本です。

すみません、私の書き方が悪かったですね。

『原因になりうるかどうか』ということをお訊きしたかったのです。
すなわち外部コンポーネントを使った場合にはメモリ参照エラーが起こりうるかどうか、それをお訊きしたかったわけです。
  • 題名: Re[7]: メモリ参照エラー
  • 著者: も
  • 日時: 2007/03/03 17:01:46
  • ID: 19246
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> すみません、私の書き方が悪かったですね。
>
> 『原因になりうるかどうか』ということをお訊きしたかったのです。
> すなわち外部コンポーネントを使った場合にはメモリ参照エラーが起こりうるかどうか、それをお訊きしたかったわけです。
たとえば「メモリ参照エラー」というものが起こるコンポーネントを作って利用すれば、メモリ参照エラーは起こるでしょう。
そうでなくメモリ参照エラーが起こる確率が非常に低いコンポーネントを作って利用すれば、やはりメモリ参照エラーは起こらないでしょう。
というわけで外部コンポーネントを使えば原因になりうるでしょう。(ならないかもしれませんが)

#原因を突き止めようとしない限りは何も進まないと思います。
■No19245に返信(ソルヴィンさんの記事)
> すみません、私の書き方が悪かったですね。
>
> 『原因になりうるかどうか』ということをお訊きしたかったのです。
> すなわち外部コンポーネントを使った場合にはメモリ参照エラーが起こりうるかどうか、それをお訊きしたかったわけです。

意図が伝わりませんでしたか。
なりうるので、切り分けましょうというお話です。

# なりうる可能性があるということは、最初から示唆していますが。
「 なりうる可能性がある」ということで承知致しました。

どうもありがとうございました。
解決済み!
  • 題名: Re[6]: メモリ参照エラー
  • 著者: y's
  • 日時: 2007/03/05 11:45:06
  • ID: 19253
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>vb.netで作成したアプリケーションをある程度の長時間動作させていると何らかの操作の後に「メモリ参照エラー」が発生することがあります。

私も以前vb.netでこの現象に悩んだ事があります。
その時のAPの処理の流れは大まかに書くと下記になります。

@AP起動
ADBから3D頂点データ取得(数百M)
BDBのデータからD3DX9のオブジェクト作成
C以降画面表示

C以降数十分稼動させておきAPを終了させようとした時か何らかの操作を行った時かは忘れましたがメモリ参照エラーが発生しました。

調べてみるとBの処理を行った後、いつまでたってもAで取得したデータが開放されていませんでした。
もちろんAで得たデータはBの処理が終わった後はスコープ外となっていますし、明示的にEraseとかNothing等も行ってみました。
結局、開放されないので大量のメモリを使用し、必要なくなったところでGC.Collectを行うことで解決させました。

DOBON.NET | プログラミング道 | プログラミング掲示板