1

几天后,我们的网站明显出现了内存泄漏(> 2Gb /pool)。所以,我在 windbg 上运行了一些命令,终于发现了一些东西:有很多System.LocalDataStoreElement. 在源代码中快速搜索(见下文)后,我发现了一个非常奇怪的类:

public class HomeController
{
    public HomeController()
    {
        CultureInfoManager.SetCulture(MyCompany.Internal.Enumerations.Site.GbEn);
    }
}
public class CultureInfoManager
{
    [ThreadStaticAttribute]
    private static Language _language;

    public static void SetCulture(Site site)
    {
        if (site == Site.Undefined) return;

        //strange ???
        var localSlot = Thread.AllocateDataSlot();
        Thread.SetData(localSlot, site.Code());

        _language = site.GetLanguage();

        var cultureInfo = CreateCultureInfo(site);
        Thread.CurrentThread.CurrentCulture = cultureInfo;
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
    }

    private static CultureInfo CreateCultureInfo(Site site)
    {
        if (site == Site.Undefined) site = Site.GbEn;
        var languageCode = site.GetLanguage().Code();
        switch (languageCode)
        {
            case "f2":
                return new CultureInfo("fr-FR");
            case "br":
                return new CultureInfo("pt-BR");
            case "s1":
                return new CultureInfo("es-AR");
            case "s2":
                return new CultureInfo("es-CL");
            case "e1":
                return new CultureInfo("en-CA");
            default:
                return new CultureInfo(languageCode);
        }
    }

    public static Language GetCurrentLanguage()
    {
        return _language;
    }

}

所以,我的问题:

  • 在这里使用 Thread.AllocateDataSlot 显然没用,但它可以解释内存泄漏吗?因为经过完整的负载测试(超过 400 000 个请求),我无法重现泄漏。
  • 将 TLS/ThreaStatic 用于 Web 应用程序是否相关?因为在 asp.net 中,我们不控制线程寿命,因为工作线程将执行许多请求。

我还在此处的 MS KB 中发现了一个问题。

总之,一切似乎都在这段代码上,但我无法重现这个问题。

4

0 回答 0