几天后,我们的网站明显出现了内存泄漏(> 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 中发现了一个问题。
总之,一切似乎都在这段代码上,但我无法重现这个问题。