我一直使用“.NET Memory Profiler”分析WinForm的应用程序。
根据Windows任务经理的说法,我似乎无法理解我的应用程序如何增长到1GB,然后是2GB,然后是3GB的使用量。
使用该工具的专用字节和“所有堆中的总字节数”仅显示为70MB左右。在我的实例列表的顶部,它们主要是String或WeakReferences到许多小对象。
所有应用程序正在执行的操作是显示从数据库加载数据的表单。我重复表格的展示/处理周期大约100次,并且增长是连续的。
我现在尝试了3种内存分析工具,但没有一种能够向我展示这种大量内存消耗的来源。
任何人都可以帮助或猜测它可能是什么吗?
感谢。
答案 0 :(得分:5)
这是VB.NET应用程序的已知问题吗?
是。编辑到可执行文件中的Edit + Continue支持的副作用。它受使用WithEvents关键字声明的任何事件的影响。 WeakReference会跟踪这些事件实例。问题是,如果您在没有调试器的情况下运行应用程序,那些WeakReferences会泄露。进程占用内存的速率在很大程度上取决于创建类的实例数。每个对象的每个事件泄漏16个字节。
解决方法很简单,不在没有调试器的情况下使用应用程序的Debug版本。仅使用发布版本。当然,只将发布版本发送给您的客户。
答案 1 :(得分:3)
根据Windows任务经理的说法,我似乎无法理解我的应用程序如何增长到1GB,然后是2GB,然后是3GB的使用量。
那是因为任务经理的反击是Tess Ferrandez在this article指出的“工作集”
还有另一个叫做的计数器 简化的工作集包括 记忆中有多少内存 当前或曾经的页面 最近被线程所感动 过程或大约,多少 进程使用的内存 目前在RAM中。工作集 如果你,反击可能会很有趣 有太多的分页和问题 同一个盒子上有很多进程 竞争RAM,但按顺序 确定你有多少记忆 使用(保留或承诺)它 提供很少或没有帮助。
来自MSDN article工作集(强调我的)
工作集
内存页面集 (分配给a的内存区域) 最近由线程使用的) 在一个过程中。如果可用内存 服务器高于指定的 阈值,页面保留在流程的工作集中,即使它们未被使用。当可用内存下降时 低于指定的阈值,页面是 从工作集中删除。如果这些 页面是必需的,它们将是 返回工作集 在他们离开主记忆之前 可用于其他进程 使用
答案 2 :(得分:0)
我发现在高CPU负载下,垃圾收集通常会获得非常低的优先级,因此负责清理未使用内存的.NET库只有在绝对必须时才会启动,尽管引用计数为a管理对象变为零。如果可以尝试在你的代码或中放入一些有意的Thread.Sleep调用,只需接受它是一个内存耗尽的事实,并希望逻辑将允许你的系统运行它将有“奇怪”的内存用法,因为你从未说过任何破坏,它只是有一个虚幻的内存占用。