【C#】 パフォーマンスプロファイラにて、どの変数に対してGCが行われたかがわからない
C#で作成中のゲームのメモリ使用量がどこかでdisposeなどを忘れていたせいで、すごく上がっており、GCで下がってまた上がってを繰り返していました。 どの変数が不要(GC対象)がわかれば、問題を解決できます。
そこで、VisualStudioのパフォーマンスプロファイラで見てみたところ、char[]などがててきて、GCがいつ行われたかしかわからなく、GCがどの変数(インスタンス)に対して行われたのかがしりたいです。
できるだけdisposeとかで対処したいから、GCが行われたインスタンスをdisposeしたらOKということです。
これくらいしか書くことないですw(エラーコードとかはないから)
##使用ツールなど
IDE:VisualStudio 2019
OS:Windows10
言語:C#
フレームワーク: .Net
フレームワークのバージョン:多分最新
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/10 06:29
2019/12/10 06:55
回答2件
0
こんにちは。
コメントを見ていたら解決済みになったため、補足的な回答を残します。
.NET において、メモリが「大きく上がって、大きく下がって」を繰り返すのは「正常な動作」です。言い換えると、「そうなることを回避する手段は存在しない」です。
.NET のメモリの管理はほぼ全て GC に任せられています。任せられているということは、自分たちでそれをどうすることもできません。それは IDisposable をどうしているかとも関係ありません。
IDisposable について勘違いしているようなのですが、IDisposable の役割は「メモリの解放」ではなく、「リソースの解放」です。
「リソース」とは、メモリの上に構成される、オープンとクローズの2つの性質を備えたオブジェクトという、「メモリ」よりも上位の抽象的概念です。
Dispose により「リソースの解放」を行うことは、.NET のメモリの消費量には影響しません。メモリの破棄を行うのは GC であり、Dispose を行ったかどうかとは無関係なのです。
GC はゴミとなったメモリでもしばらく蓄え続け、あるタイミングで一気に解放します。そのため、大きく上がって下がってを繰り返すグラフになります。
これは、GC を実行すること自体がそこそこコストがかかる動作なので、ある程度溜め込んで一気にやった方が (速度的に) 効率的だからです。メモリの消費を最小限に抑えることを諦め、速度を優先したということです。
もし、なんとしてもメモリ使用量グラフを平坦に保ちたいのであれば、何かオブジェクトを使い終わる度にすぐさま「手動で GC を実行する」ことでおそらく実現できるでしょう。
ただし、実行速度はお話にならないほど低下すると思います。
投稿2019/12/10 08:14
編集2019/12/10 08:20総合スコア4243
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
C#で作成中のゲームのメモリ使用量がどこかでdisposeなどを忘れていたせいで、すごく上がっており
もし上記文章が「メモリリークが発生した真の原因」である場合の回答です。
リソースの解放(Dispose
)が必要なオブジェクトにはIDisposable
インターフェースが実装されているので、まずはプロジェクト内に該当のオブジェクトが使用されているかを確認してください。
IDisposable
なオブジェクトを見つける方法の1つは以下の通りです。
0. IDisposable
なオブジェクトを1つ見つける
0. IDisposable
と書かれたテキスト部分をダブルクリックで選択し、右クリックでメニューを表示
0. 「すべての参照を検索」を選択
これで、プロジェクト内で定義されているIDisposable
なオブジェクトが全て表示されるはずです。
その一覧を参考に、各IDisposable
なオブジェクトを生成している処理に対して適切なタイミングでDispose
メソッドを呼んでください。
これで、Dispose
忘れによるメモリリークは解決すると思います。
また、「Dispose
メソッドを呼んでください」と書きましたが、リソース解放に便利な構文としてusingステートメントがありますので、可能ならDispose
メソッドではなくこちらを使用してください。
投稿2019/12/10 06:44
編集2019/12/10 07:08総合スコア2663
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/10 06:46
2019/12/10 07:27
2019/12/10 07:29
2019/12/10 07:34 編集
2019/12/10 07:34
2019/12/10 07:35
2019/12/10 07:35
2019/12/10 07:37
2019/12/10 07:39
2019/12/10 07:43
2019/12/10 07:44
2019/12/10 07:44
2019/12/10 07:45
2019/12/10 07:46
2019/12/10 07:48
2019/12/10 07:49
2019/12/10 07:51 編集
2019/12/10 07:50
2019/12/10 07:51
2019/12/10 07:52
2019/12/10 07:53
2019/12/10 07:54
2019/12/10 07:55 編集
2019/12/10 07:54
2019/12/10 07:57
2019/12/10 07:59
2019/12/10 08:01
2019/12/10 08:02
2019/12/10 08:20 編集
2019/12/10 08:06
2019/12/10 08:06
2019/12/10 08:10
2019/12/10 08:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。