我有一个用 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 对象持有的对象是什么?
谢谢!