2015-07-20 81 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中。它可能会交换到磁盘。 –