我在这里有一个奇怪的行为:我在生产中遇到了大量内存泄漏,运行一个运行在DLOG终端( SP1)上的WPF应用程序,如果我在普通桌面上本地运行它(Win7 Prof),这个应用程序的性能会非常好。
经过多次失败的尝试,我把其中一个问题直接放在我的显示器旁边,安装了ANTs MemoryProfiler,并在终端和我的开发PC上进行了一个小时的测试,模拟用户操作。
结果是,由于一些奇怪的原因,嵌入式系统堆积了大量的WeakReference和EffectiveValueEntry[]对象。
以下是一些图片:
发展(PC):


航站楼:

看看课表..。

以前有人见过这样的东西吗?有没有人知道解决这个问题的方法?我在哪里能得到帮助?
(PS安装了为.net4准备图像的终端)
PPS:对于接近投票的人:我想问题很清楚:我如何解决这个问题?如果这是IT/OS问题还是编程问题,您可能会争论,但我想如果我在服务器故障中发布这篇文章,它很快就会关闭话题.
更新:我找到了问题的很大一部分--但感觉有点像C++:我为WPF列表使用了一个类似ViewModel的Items类,它提供了一个ICommand (RelayCommand)。在ViewModel的getter中动态创建的项--视图的属性--似乎应用程序/GC从未释放那些未使用的命令--或对其CanExecuteChanged的订阅--内存分析器将这些条目显示为“由弱引用持有”。我更改了代码以重用这些项目--视图模型,并将Dispose /设置为空它们中的每个已使用的属性,并将其用作清理--就像我说过的那样:在过去的C++时代,感觉就像是“删除”。最重要的是,我每30分钟使用一次强制GC.Collect (是的,我知道--你永远不应该--但到目前为止我没有其他解决方案)。使用此设置,应用程序运行6+小时,到目前为止没有问题,但感觉不对。
我不明白为什么那些WeakReferences没有被认领,因为它们在我的台式计算机上.
对此有什么想法吗?请!
更新:我仍然无法确定这个问题,但我看到了一个奇怪的行为:如果我使用PC-任何地方观察我的软件运行在其中一个终端,问题就消失了!即使跑了8小时。软件正常运行--它甚至会释放内存(我在主屏幕上放了一个小内存计数器--假设我连接到终端,看到内存很低--等待几分钟后,内存就被回收了)。
因此,我认为Devin (下面的一个答案)在正确的方向上领先--远程控制软件中的某些东西可以打开终结器线程或任何阻塞GC的东西--不管是模拟键盘/鼠标还是其他什么。
对此有什么想法吗?
发布于 2012-05-01 22:32:27
我们在平板电脑上运行我的应用程序也有类似的问题。当在桌面上运行时,内存将被回收,而在使用PC输入面板的平板电脑或其他设备上运行时则不会被回收。问题是,终结队列被卡住了。COM对象终结器正在等待在没有消息循环的主线程上运行某些内容。
解决方案是找到足够的时间来调用Application.DoEvents()。我们有一个间歇调用的方法,每10次调用一次就调用它。我不知道这是不是你的问题,但也许它可以提供一些启示。
编辑:我确实需要说清楚,一般来说,打电话给DoEvents()是个坏主意。在这种情况下,它可以工作,因为线程上没有UI,也没有任何其他事件可能会干扰的事件。
发布于 2012-06-06 16:00:33
从截图中可以看到,LOH在增长的同时,所使用的空间并没有增长太多。在LOH中,自由空间有很大的增长,这表明内存碎片是由于固定的对象造成的。这看起来像是一个卡住的终结器线程,它确实阻止了托管对象的清理。您应该获得一个内存转储,并检查终结器线程被卡在哪个方法中。使用Windbg可以很容易地做到这一点。
https://stackoverflow.com/questions/10173185
复制相似问题