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

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

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

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

Q&A

解決済

1回答

5030閲覧

TextBoxBase.Clear でOut Of Memory 発生?

nobysanz

総合スコア42

C#

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

0グッド

0クリップ

投稿2016/01/04 13:25

編集2016/01/04 13:27

お世話になります。
C#にて、フォーム内のテキストボックスに、定期的にログを追加して表示しております。1日の日替わりでファイルへ出力し、テキストボックスの内容をクリアしてますが、その時に、Out Of Memory が発生しました。 Clear 処理(=メモリ解放する?)と思いますので、要因についてご教授をお願いいたします。

Exceptionの内容から推測すると、Memory不足に陥ってると思いますが、OS全体のメモリ不足なのか、アプリケーション内でのメモリ不足なのか?判断しかねております。

以下、スタックトレースと処理のソースです。

2016/01/03_00:00:01,303 - 理由種類 'System.OutOfMemoryException' の例外がスローされました。 2016/01/03_00:00:01,303 - スタックトレース 場所 System.String.InternalCopy(String str) 場所 System.Text.StringBuilder.ToString() 場所 System.Windows.Forms.Control.get_WindowText() 場所 System.Windows.Forms.TextBoxBase.get_WindowText() 場所 System.Windows.Forms.Control.set_WindowText(String value) 場所 System.Windows.Forms.TextBoxBase.set_WindowText(String value) 場所 System.Windows.Forms.Control.set_Text(String value) 場所 System.Windows.Forms.TextBoxBase.set_Text(String value) 場所 System.Windows.Forms.TextBox.set_Text(String value) 場所 System.Windows.Forms.TextBoxBase.Clear()

C#

1private void timer1_Tick(object sender, EventArgs e) 2{ 3 try 4 { 5 // ログをキューから取出し表示する_ 6 DateTime dtNow = DateTime.Now; 7 lock (_logBufferQue) 8 { 9 while (_logBufferQue.Count > 0) 10 { 11 txtMessage.AppendText( 12 String.Format("{0} - {1}", dtNow.ToString("yyyy/MM/dd_HH:mm:ss"), _logBufferQue.Dequeue())); 13 txtMessage.AppendText(Environment.NewLine); 14 } 15 } 16 // 日替り判定_ 17 if (_dateTimeText.Substring(0, 10) != System.DateTime.Now.ToString("yyyy/MM/dd")) 18 { 19 //日替わりしたら、現在表示している情報をファイルに保存する_ 20 SaveSystemLog(true); // 「前日」でファイルに保存 21 txtMessage.Clear(); 22 } 23 // 現在日付を保持_ 24 _dateTimeText = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm"); 25 } 26 catch (Exception exp) 27 { 28 Console.WriteLine("FormChild00000.timer1_Tick(): ログの表示、または日替り判定に失敗しました。", 29 exp.Message, 30 exp.StackTrace); 31 } 32}

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

スタックトレースを見ると、set_WindowText()からget_WindowText()が呼び出され、その中でInternalCopy()が呼ばれています。これを見る限り、コントロールのテキストを(たぶん)""へ変更する際に、現在記録されているテキストを一度どこかへコピーしている可能性があると思います。その時、メモリ不足が発生したのではないでしょうか?

Windowsは仮想記憶があるので物理メモリが不足するとHDDへスワップアウトし、メモリ不足は事実上起きないものと思っていました。
しかし、ここをみると32bit Windowsの場合、2GBytesのメモリ空間を使い切ると発生するようです。以前、catsforepawさんが確認して頂けたのですが、64bit Windowsでも発生するようです。

従って、メモリ空間を食い尽くしてしまったのではないでしょうか?
これが正しい場合、メモリ空間はプロセス毎に割り当てられますので、下記についてはアプリケーション内のメモリ不足として捉えて良いように思います。

Exceptionの内容から推測すると、Memory不足に陥ってると思いますが、OS全体のメモリ不足なのか、アプリケーション内でのメモリ不足なのか?判断しかねております。

つまり、他のプロセスは稼働可能と思います。ただし物理メモリが不足していると言う事実は変わりませんので、スワップが頻発し性能が劣化している可能性があります。

投稿2016/01/04 13:49

編集2016/01/04 13:51
Chironian

総合スコア23272

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

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

nobysanz

2016/01/05 10:59

コメントありがとうございます。 自プロセスの利用メモリが肥大化してると考えたほうが良いですね。 リークしていないか調査してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問