2

我有一个用 VB.NET 编写的服务,它会泄漏内存。即使它没有做太多,记忆也会增长。它开始在任务管理器中使用大约 29,000 K,几个小时后,根据它的繁忙程度,它会增长到 500,000K 或有时超过 1,000,000K。对于某些客户,这会导致他们的服务器出现内存问题。该服务具有自动重启功能,该功能将每天重启一次服务,但有时这还不够,我们需要每天多次使用 Windows 调度程序的网络停止/启动。

PerfMon 显示“第 2 代堆大小”在服务运行时继续增长,而其他堆数则不会。当然,“# Bytes in all heaps”也会增长,因为它包含了这个数字。

当我创建正在运行的服务的转储文件时,在windbg中打开它,加载SOS,然后在其上运行“!dumpheap -stat”,最大数量的对象是“System.WeakReference”类。在我现在查看的示例中,共有 4,636,227 个对象,其中有 4,542,785 个。

根据我的阅读,GC 使用这些对象来保存对它正在使用的对象的引用,这是怎么出现的?如果是这样,为什么在处理完它们后它也不会 GC 呢?有没有办法查看 WeakReference 对象持有的对象是什么?

谢谢!

4

2 回答 2

2

WeakReference持有对对象的弱引用,但对WeakReference-instance 的引用很难,因此:如果您持有大量死 ( IsAliveis false) 引用,它们仍将使用内存。

确保不要将您WeakReference的 s 存储在列表中或以其他方式永久存储它们。

编辑:如果您自己没有持有引用,这可能是由VB.NET 中的问题WithEvents引起的。简而言之,在发布模式下编译您的应用程序,该问题应根据 Microsoft 进行修复。

于 2012-10-08T13:20:52.243 回答
0

似乎代码中对 WeakReference 类的使用无效。要定位代码、构建实例,请使用一些分析工具,该工具可以从分配点跟踪整个对象的生命周期(例如 dotTrace Memory)。有人忘记从某个集合中清除 Dead 弱引用实例。查找并修复。

于 2012-10-08T14:23:59.670 回答