2015-07-20 44 views
3

我面對這張圖,剖析我的應用程序的內存使用情況時:「分析器圖」中的「非託管內存」。這是內存泄漏指示嗎?

enter image description here

正如你可以看到,前行的「快照1」非託管內存大約持有總使用內存的一半。然後,在「快照1」和2分55秒後(請參閱下面的時間表),我強制垃圾收集。如我所料,第二代大部分是收集的,但非託管內存沒有被釋放,現在它保存了大約90%的內存。總使用內存的2/3。

我不知道,在這種情況下,「非託管內存」是什麼意思。 這是帶有一些WinForms/GDI + interop的WPF應用程序。我相信,所有應該處置的東西都會被處置掉。此外,沒有明確的平臺互操作代碼。託管內存的其餘部分是可以的。

這是內存泄漏指示嗎?
如果是這樣,在這裏檢測內存泄漏的方法是什麼?
這是重要的,我使用的探查器是JetBrains dotMemory。

+0

WPF使用DirectX。也許這是非託管內存的來源? _ [WPF完全依賴Direct3D進行渲染](https://msdn.microsoft.com/en-us/library/aa663364.aspx)_ – MickyD

+0

這只是一個真正的漏洞,如果它不斷地建立並最終炸燬你的程序。一般來說,Profiler幾乎沒有什麼體面的方法可以告訴你關於非託管內存的任何事情。當然,WPF應用程序會使用它很多。保留模式圖形渲染很好,它不是免費的。在現代機器上不是真正的問題。將注意力集中在自己的代碼中的泄漏處,對WPF管道系統沒有什麼可以做或應該做的。 –

回答

4

dotMemory圖表上的「Total used」內存是進程的私有工作集。它是進程可執行文件要求的內存 - 不一定是實際使用的數量。它包含所有的DLL和堆,但不包括內存映射文件(共享DLL)。此外,無法判斷它是屬於可執行文件本身,還是屬於鏈接庫。這不是唯一的物理記憶;它們可以被分頁到磁盤或在待機頁面列表中(即不再使用,但也不分頁)。 因此,非託管內存是除了託管CLR堆以外的私人工作集中的所有內容。通常你沒有簡單的方法來改變純粹的.net進程的非託管內存量。在程序執行期間它幾乎是不變的。

+0

我懷疑「私人工作組」是否正確。工作集描述了物理RAM中的某些內容。應用程序要求的內容不一定在物理RAM中。它可能會交換到磁盤。 –