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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Q&A

2回答

7506閲覧

TextBoxコントロールを使用してログ表示、長期実行するとWorking Setが上昇し続ける。

fuoh

総合スコア19

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

1グッド

2クリップ

投稿2017/01/20 03:03

いつもお世話になっております。さっそくで恐縮ですが質問させてください。

アプリケーションの概要ログを表示するため、フォームにTextBoxコントロールを配置してAppendText()メソッドにより文字列を追加しています。また、日付が変わるときにTextBoxの文字列をファイルに書き出し、Clear()メソッドにより文字列をクリアしています。
この方法で、長期(6ヶ月以上)アプリケーション実行しているとWorking Setが上昇し続けます。

そこで、日替わりで文字列をファイルに書き出した後、TextBoxのインスタンスを破棄して再生成するようにしました。
以下の手順にてTextBoxのインスタンスを破棄、再生成しています。

1.フォームのControlsからTextBoxを削除する(Remove()メソッドにより削除)。
2.TextBoxのDispose()メソッドを呼ぶ。
3.TextBoxの変数にnull代入。 <- ここで参照がきれると考えています。
4.TextBoxのインスタンスを生成する。
5.TextBoxの初期設定。
6.フォームのControlsにTextBoxを追加する(Add()メソッドにより追加)。

破棄して再生成するのは、参照をきり、ガベージの対象にとの考えからです。しかし、実際には、回収されず、Working Setは、上昇しています。

お聞きしたいのは、ガベージの対象とするためにインスタンスを破棄して再生成するのは、間違った考えでしょうか?
または、インスタンスの破棄の考え方が間違えているのでしょうか?

OS:Windwos 7
言語:C#
開発ツール:Visual Studio 2005
実行環境:.NET Framework 2.0

ynakano👍を押しています

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

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

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

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

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

guest

回答2

0

ご説明の内容のみから判断する限りでは、特に間違ったことはしていないと思います。
あとは実際のコードを載せていただかない限りはなんとも言えないです。

まず、AppendText()とClear()を繰り返すことによりWorking Setが上昇したので破棄と再生成に変えたとおっしゃっていますが、本当に原因は特定できていますか?

例えば以下のような感じで、最小限のコードで現象が発生することを確認できますでしょうか。

C#

1//FormにTextBoxとButtonを配置して、Buttonクリックから以下を走らせる 2async private void button1_Click(object sender, EventArgs e) 3{ 4 //適当な回数のループ 5 for (int i = 0; i < 1000; i++) 6 { 7 //10000文字×10回のAppendText 8 for (int ii = 0; ii < 10; ii++) 9 { 10 textBox1.AppendText(new string('あ', 10000)); 11 } 12 13 textBox1.Clear(); 14 15 //画面が固まらないように休憩をはさむ 16 await Task.Delay(1); 17 } 18 19 //明示的にGCをかけておくとわかりやすい 20 GC.Collect(); 21 GC.WaitForPendingFinalizers(); 22 GC.Collect(); 23} 24

ちなみに手元でちょっと試してみた限りでは、上記のAppendText()とClear()ループによる極端なWorking Set上昇は見られませんでした。

投稿2017/01/20 13:45

oika

総合スコア425

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

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

fuoh

2017/01/20 14:07

ご回答ありがとうございます。 いくつかの要因を推定してデータを取りながら確認した結果、TextBoxが要因ではないかと考えています。 テストコードありがとうございます。 参考にさせていただきます。
fuoh

2017/01/23 02:37

追加の情報としまして、データを取りながら確認で、Working Setの上昇率は、2日間で約0.43%です。 短時間に急上昇するのではなく、長期に少しずつ上昇しています。
oika

2017/01/23 03:15

問題の切り分けが不十分なように思います。 長期連続起動が問題ならば、AppendTextやClearを何もしなくても上昇するものと考えるのが自然で、なんらかの処理が原因で上昇するならば、それを連続でループしてやれば短時間でも再現できるはずではないかと思います。 (仮説の域を出ないですけどね…)
guest

0

もしガベージコレクションが原因だとすると以下のリンクが参考にならないでしょうか?
ガベージ・コレクタを明示的に動作させるには?

投稿2017/01/20 07:58

PineMatsu

総合スコア3579

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

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

fuoh

2017/01/20 08:11

ご回答ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問