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

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

ただいまの
回答率

90.53%

  • C#

    8813questions

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

  • Visual Studio

    2288questions

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

  • Windows 7

    409questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 2,297

fuoh

score 10

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

アプリケーションの概要ログを表示するため、フォームに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 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 17:11

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

    キャンセル

0

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

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

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

//FormにTextBoxとButtonを配置して、Buttonクリックから以下を走らせる
async private void button1_Click(object sender, EventArgs e)
{
    //適当な回数のループ
    for (int i = 0; i < 1000; i++)
    {
        //10000文字×10回のAppendText
        for (int ii = 0; ii < 10; ii++)
        {
            textBox1.AppendText(new string('あ', 10000));
        }

        textBox1.Clear();

        //画面が固まらないように休憩をはさむ
        await Task.Delay(1);
    }

    //明示的にGCをかけておくとわかりやすい
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/20 23:07

    ご回答ありがとうございます。
    いくつかの要因を推定してデータを取りながら確認した結果、TextBoxが要因ではないかと考えています。

    テストコードありがとうございます。
    参考にさせていただきます。

    キャンセル

  • 2017/01/23 11:37

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

    キャンセル

  • 2017/01/23 12:15

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

    キャンセル

同じタグがついた質問を見る

  • C#

    8813questions

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

  • Visual Studio

    2288questions

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

  • Windows 7

    409questions

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