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

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

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

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

Windows 7

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

Q&A

2回答

2963閲覧

メモリリークするアプリケーションでガベージコレクトを頻繁に実行すると処理が遅くなるか

fuoh

総合スコア19

C#

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

Windows 7

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

0グッド

0クリップ

投稿2018/06/28 04:17

24時間365日稼働させているとアプリケーションの処理が遅延する状況があり、その要因について
以下のように考えました。

以下、問題点が判明しています。

 0. キューにデータを格納するが取り出さない問題がある。
0. 画面表示の更新周期でガベージコレクト(GC.Collect()の呼び出し)を実行する問題がある。

アプリケーションの処理が遅くなる理由を考えました。

 - キューへデータを格納して取り出さないため、日々使用可能メモリを圧迫していく。
- 表示更新時にガベージコレクトを実行するが、蓄積した量により徐々に処理時間が長くなる。
処理時間が長くなる理由は、回収可能かの判定処理が蓄積したデータ全てに行われるため、
蓄積量に比例して時間がかかると考えています。
- 上記によりアプリケーションの処理が、徐々に遅延していく。
アプリケーションの処理が遅延する理由は、ガベージコレクト中は、メモリへのアクセスが
ブロックされ、アプリケーションの処理が待たされると考え、ガベージコレクトの時間が
長くなることで待たされる時間も長くなると考えています。

上記要因は、考えにくいでしょうか、的外れでしょうか?
お教えいただければ幸いです。


OS:Windows7 Professional
.NET Framework 2.0

開発環境:VisualStudio 2005
言語:C#

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

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

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

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

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

hmmm

2018/06/28 10:55 編集

これは具体的に遅くなる箇所の特定はできているんですか?GC.Collectに時間がかかるとか。そうではなくなんとなく遅いとかですか。
guest

回答2

0

こんにちは。

はじめに

古い.NET Frameworkを用いる場合(今回であれば2.0)、ガーベージコレクションの処理に問題を抱えており、メモリリークのリスクが、新しいそれと比べて高くなります。

こちらのサイトがわかりやすく説明されておりますのでご確認ください。
.NETのメモリ管理と断片化問題

キューイングしているオブジェクトの詳細がわかりませんが、メモリリークせずとも断片化したメモリ領域がGCおよび、その他の処理に影響を与える可能性は考えられます。

本題

これは質問者様の意見や考えを否定するものではないことをご理解ください。

先に記載した通り、質問者様の考察は的外れではないと思います。ですが、憶測の域を出ません。
すでに明示的にGCの実行を指示している場合は、その個所で処理コストを計測してください。
稼働時間に応じてそこのコストが増しているのではあれば、質問者様の考察が外れていないことがわかります。

また、個人的なスタンスで恐縮ではございますが、GCは自動的に行われることが望ましく、GCを強制的に動かさないといけない状況というのは、何か別の要因があると考えます。
今回の質問で言えば、キューにデータがたまり続けるということがそれにあたります。

質問の回答ではないかもしれませんが、問題をもう少し細かくしたほうが解決が早いように思います。

参考になれば幸いです。

投稿2018/06/28 05:24

g_uo

総合スコア212

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

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

fuoh

2018/06/28 05:38

ご回答ありがとうございます。 ご提示いただいたサイトを参考にさせていただきます。 確認方法としては、ガベージコレクト(GC.Collect()呼び出し)の前後でStopwatchのStart()とStop()を 実施して時間計測するで認識で間違いないでしょうか?
g_uo

2018/06/28 05:45

コメントありがとうございます。 はい、その認識で問題ありません。ただ、StopWatchクラスのインスタンスは計測の度に作らないようにしてください。(クラスのメンバとして定義) 調査用のコードが、調査対象の事象に大きく影響することを防ぐためです。
fuoh

2018/06/28 05:57

アドバイスありがとうござます。 早速、確認したいと思います。
guest

0

キューにデータを格納するが取り出さない問題がある。

取り出さない=取り出せない なんでしょうかね?
直接的な原因は取り出せない方にありそうですが・・・

画面表示の更新周期でガベージコレクト(GC.Collect()の呼び出し)を実行する問題がある。

一般的にコードでGC.Collect()を呼んでしまうと、本来早めに開放されるべきオブジェクトが開放され辛くなってしまうという話をよく聞きます

明示的に呼び出すのを辞める事でパフォーマンスに影響が出る可能性もあります。
(ガベコレのタイミングはフレームワーク任せのほうがマシの可能性があります)

投稿2018/06/28 04:47

takabosoft

総合スコア8356

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

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

fuoh

2018/06/28 05:00

早速のご回答、ありがとうございます。 説明足らずで申し訳ありません。 ご指摘の通りなのですが、 ・キューから取り出さない問題(=バグ)。 ・ガベージコレクトを明示的に呼び出す問題(=バグ)。 との認識はあります。 そのうえで、処理が遅延する要因として黒丸の内容は、 的外れなのかというところを確認したかったのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問