有一个Windows服务,其中包括监视IIS应用程序池.如果任何池已配置应用程序且未运行,则启动它(池).这已经有一段时间了.最近发现该服务泄漏了内存.查看内存转储的罪魁祸首是用于检查应用程序池的Microsoft.Web.Administration.一次性使用的唯一对象是ServerManager,我在使用块中有这个对象.已找到有关此泄漏的其他报告但尚无解决方案.(请参阅http://msdn.microsoft.com/en-us/library/microsoft.web.administration.servermanager(v=vs.90).aspx#CommunityContent中的用户评论)
转储Microsoft.Web.Administration.ServerManager(此转储中的481)的所有根时,我只看到其中一个根.假设这是当前的迭代.
不确定为什么这些Web.Administration对象无法收集,即使它们似乎没有根((?).有关如何堵塞这种泄漏的任何想法?
我将代码移动到控制台应用程序并在那里重现泄漏.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Microsoft.Web.Administration;
namespace Web.Administration.LeakExample
{
public static class ServerManagerExtensions
{
/// <summary>
/// Returns the application counts for application pools under the specified ServerManager.
/// Application pools without applications will not be returned.
/// </summary>
/// <param name="manager"></param>
/// <returns></returns>
public static Dictionary<string, uint> GetPoolApplicationCounts(this ServerManager manager)
{
if (manager == null)
{
throw new ArgumentNullException();
}
var appCounts = new Dictionary<string, uint>(manager.ApplicationPools.Count);
foreach (var app …Run Code Online (Sandbox Code Playgroud) 任何人都有任何关于如何使这项工作或可能出错的想法?
托管服务器上的网络跟踪:
来自非共享IP地址的站点的成功请求:
No. Time Source Destination Protocol Info
6366 15:54:35.590463 192.168.1.76 173.194.77.121 HTTP GET /key/value/one/two HTTP/1.1
6369 15:54:35.599879 173.194.77.121 192.168.1.76 TCP http > 55407 [ACK] Seq=1 Ack=110 Win=344 Len=0
6370 15:54:35.621587 173.194.77.121 192.168.1.76 HTTP HTTP/1.1 200 OK (application/json)
6608 15:54:35.815774 192.168.1.76 173.194.77.121 TCP 55407 > http [ACK] Seq=110 Ack=357 Win=509 Len=0
Run Code Online (Sandbox Code Playgroud)
来自使用共享IP地址的站点的请求失败:
No. Time Source Destination Protocol Info
9720 15:54:39.244192 192.168.1.80 173.194.77.121 HTTP GET /key/value/one/two HTTP/1.1
9760 15:54:39.256958 173.194.77.121 …Run Code Online (Sandbox Code Playgroud)