問題タブ [unmanaged-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# でアンマネージ メモリ リークを特定する方法
私たちのアプリケーションでメモリリークが発生して困っています。顧客のマシンでのみ発生するか、少なくとも私のマシンで再現するためのテストに失敗しました。幸いなことに、私たちのアプリケーションは、未処理の例外が発生した場合にログ ファイルにデータを収集し、OOM の場合はダンプ ファイルを書き込みます。これは 32 ビットの C# WinForms プログラムです。
これまでにわかったこと:
クラッシュするまで、プロセスは約 3 時間実行されていました
クラッシュ時に、次の値が収集されました。
currentProcess.WorkingSet64 = 1.8 GB currentProcess.VirtualMemorySize64 = 2.0 GB currentProcess.PrivateMemorySize64 = 680 MB
これが、管理されていないと思った最初のポイントです。WorkingSet が PrivateMemory よりもはるかに高いのはなぜですか? 多分サードパーティのdllだと思いますか?
さらに分析するために、メモリダンプをWinDbgにロードしました
SOS コマンド !analyzeoom は、GC ヒープへの割り当てが原因で管理された OOM がなかったことを示しています。確認するために、GC ヒープの合計サイズが 217 MB、ローダー ヒープが 38 MB であることを示す !eeheap を調べました。
今、私はすべてのヒープを見たいと思っていました。しかし、!heap -s を使用すると、Commited Bytes 170 MB の合計値が示されました
!dumpheap -stat は、最大の消費者が約 10 ~ 25 MB であることを再度示しています。38 MB を構成する約 4000 個の Free オブジェクトもあります。
最後の値は、おそらく OOM が断片化によって引き起こされているのではないかと考えさせました。しかし、38 MB はそれほど聞こえません。
この時点で、続行する方法がわかりません。この膨大な量の不足しているメモリを見つけるにはどうすればよいですか? サードパーティのアセンブリかどうか、どのアセンブリかを確認するにはどうすればよいですか?
残念ながら、機密性の高い顧客データが含まれているため、メモリ ダンプを共有することはできません。しかし、私はアドバイス/ヒントに感謝しています