我们遇到的情况是我们的应用程序在执行某些定期操作时会泄漏内存。
测试场景由两个相对复杂的WPF窗口中的一系列进程组成。
关于这种情况的奇怪之处在于内存只会在某些机器上泄露,而其他机器具有完全相同的硬件,可以长时间工作(每分钟重复一次),内存几乎不变(一旦GC消除了已用的内存等。)
这是.NET + WPF。关于从哪里开始寻找的任何想法?什么能导致只有一些机器泄漏? (我们谈论的是30机器测试场景)。
我对WPF的经验很少,显卡是否与它有任何关系?
答案 0 :(得分:2)
这可以尝试一些简单的事情。下载SysInternals Process Explorer,运行您的应用程序,然后转到流程属性中的“性能”选项卡。在那里,您将看到有关不同句柄的实时统计信息:GDI句柄,用户句柄,...现在观察这些句柄是否会增长。
答案 1 :(得分:1)
我从一个分析器开始,看看热点在哪里,以及你在这个定期动作中看到的内存使用模式。很难说什么会导致这样的问题,但要记住GC不是确定性的,所以人们可能会遇到这种奇怪的情况。
编辑:同意OP对我帖子的评论。我想我想要的是,即使使用相同的硬件和软件,系统仍然存在一定程度的不确定性。
答案 2 :(得分:1)
我使用Ant Profiler来检查我的应用程序是否存在内存泄漏,还有许多其他应用程序用于测试这个但你应该考虑使用一个并确保没有泄漏的东西,并且巧合的是一些机器正在显示结果
答案 3 :(得分:0)
我认为我们找到了答案......我们仍在测试,但似乎应用程序不再泄漏内存。
http://support.microsoft.com/kb/967634
渲染中发生内存泄漏 你的WPF应用程序的线程 执行以下操作之一:
您使用软件渲染 用于渲染3D场景的管道 包括VisualBrush对象或 DrawingBrush对象。例如,你 正在使用软件渲染 管道当你执行其中一个 以下操作:您渲染 场景使用RenderTargetBitmap 类。
您打印场景。你设定 渲染层属性为0.你 通过远程桌面渲染场景 连接。
您可以通过渲染场景 使用WriteableBitmap类 不使用Windows的计算机 显示驱动程序模型(WDDM)。你用 硬件渲染管道 使用平铺渲染场景 VisualBrush对象或平铺 DrawingBrush对象在计算机上 不使用WDDM。