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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

3回答

23595閲覧

バイト配列をnewで確保し、処理を抜けて解放することを繰り返していると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年前にリリースされました。

0グッド

3クリップ

投稿2017/04/10 02:50

編集2017/04/10 06:09

処理中、バイト配列をnewで確保し、特に解放処理を行わず、処理を抜けることで解放していると考えています。この処理を定期的に繰り返しているとWorking Setの値が上昇していきます。

ここで質問ですが、Working Setの値が上昇する要因は、何が考えられますでしょうか?

public byte[] ToByteArray() { int size; // バイト配列に変換 byte[] temp0 = BitConverter.GetBytes(_DLE); byte[] temp1 = BitConverter.GetBytes(_STX); byte[] temp2 = BitConverter.GetBytes(_DATALENGTH); byte[] temp5 = BitConverter.GetBytes(_BCC); byte[] temp6 = BitConverter.GetBytes(_ETX); size = GetLength(); ※ 例えば、10と返ってきます // 各要素を一つのバイト配列へ格納 byte[] sendBytes = new byte[size]; ※ ここで、10バイトの領域を確保します temp0.CopyTo(sendBytes, 0); temp1.CopyTo(sendBytes, 1); // ビックエンディアンで格納 Array.Reverse(temp2); temp2.CopyTo(sendBytes, 2); _DATA.CopyTo(sendBytes, 4); // BCCを計算 int BCC = 0; for (int i = 2; i < (4 + (_DATALENGTH - 1)); i++) { BCC += sendBytes[i]; } sendBytes[5 + (_DATA.GetLength(0) - 1)] = (byte)(256 - BCC); // 2の補数をとる sendBytes[size - 1] = temp6[0]; // バイト配列を返す return sendBytes; }

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

以下、追記です。
実際に確保するサイズは、65KBを超えません。大きくて600B程です。

現状:
パフォーマンスモニターで、対象アプリのWorking Setを監視しています。
その結果、上昇、下降を繰り返しながら徐々に右肩上がりに上昇しています。

不具合:
対象アプリは、長期実行(24H、365日)するため、メモリが不足することにならないか?

欲しい答え:
サンプルコードのような処理では、問題にならない。

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

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

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

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

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

umyu

2017/04/10 03:39

実際のコードでnewで確保しているバイト配列のサイズは85KBを超えてますか?
fuoh

2017/04/10 04:34

サイズは、85KBを超えません。大きくても600B程です。
guest

回答3

0

処理を抜けた時点では開放可能になっただけで、解放されていません。
開放はガベージ・コレクタが行います。
ですから、Working Setの値が上昇は通常は気にする必要はありません。

投稿2017/04/10 03:02

hihijiji

総合スコア4150

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

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

fuoh

2017/04/10 03:14

早速のご回答、ありがとうございます。 説明不足で申し訳ありません。以下追記です。 Working Setの値ですが、6ヶ月などの長期間実行すると上昇・下降を繰り返し、徐々にですが上昇している状況です。
hihijiji

2017/04/10 03:44

ご提示のコードの範囲では、メモリリークの要因になりそうなコードは見当たりません。 >上昇・下降を繰り返し、徐々にですが上昇している だから異常ってわけではないです。 Working Set を監視するツールは何を使っているかなどの情報があれば、もう少し詳しいアドバイスが得られるかもしれません。
fuoh

2017/04/10 03:54

ツールは、パフォーマンスモニタを使用しています。
hihijiji

2017/04/10 04:48

聞き方が悪かったかも知れませんが、 現状:「どんなツールで収集した結果がこんな風になってる」など 不具合:「それによってこんな不安がある」など 欲しい答え:「現状が正常であるのか?」など をコメント欄ではなく質問に書き足してください。
hihijiji

2017/04/10 07:53

サンプルコードのような処理では、問題になりません。 .netは世代別ガベージコレクションを採用しています。 若い世代を回収しも古い世代が残ることがあるため、利用メモリが上昇して見えることはあります。しかし必要に応じて古い世代も回収されます。
guest

0

ガベージコレクトされるまで上昇し続けるのは通常の動作ではないでしょうか。

GC.Collect メソッドで強制的にガベージコレクトさせれば想定される動作に近づくかもしれませんが、副作用が想定できません。

投稿2017/04/10 02:56

workaholist

総合スコア559

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

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

fuoh

2017/04/10 03:18

早速のご回答、ありがとうございます。 説明不足で申し訳ありません。以下追記です。 Working Setの値ですが、6ヶ月などの長期間実行すると上昇・下降を繰り返し、徐々にですが上昇している状況です。
workaholist

2017/04/10 05:55

どれくらいの期間、間隔ごとに、上限下限を記録し、それがどの程度ずつ上昇しているのでしょうか。
guest

0

こんにちは。

処理を抜けることで解放していると考えています。

ここが違います。
C#はガベージ・コレクション(GC)で使わなくなった(参照されていない)メモリを回収する方式です。
GCは自動的に適宜走るため、実際に回収されるまでにはタイムラグがあります。
ですので、基本的にはワーキングセットの増大はあまり気にしなくて良いです。
.NETアプリケーションとワーキングセットが参考になりそうです。

とはいえ、GCで回収できないメモリ・リークもありますので注意は必要です。
(相互参照や循環参照がある場合や、リスト等へ記録後、使わなくなってもリストの当該要素を解放していないなどなど)

投稿2017/04/10 03:04

Chironian

総合スコア23272

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

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

fuoh

2017/04/10 04:41

早速のご回答、ありがとうございます。 確認させてください。 「使わなくなってもリストの当該要素を解放していない」とは、以下の理解でよろしいでしょうか?  リストにAdd()で要素を追加したが、使用後もそのままとしている。  Clear()やRemove()等で、要素を削除していない。
Chironian

2017/04/10 05:50

その通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問