我一直在对静态对象和高频与低频堆进行大量研究。我知道高频堆不是垃圾收集的。我的问题是,如果我将普通类中的数组或字典实例化为 Web 服务器中的静态实例:
public class Lookup
{
private static readonly Lookup instance = new Lookup();
private Dictionary<Decimal, Enum> _enums;
public static Enum GetEnum(Decimal value)
{
return instance._enums[value];
}
Lookup()
{
_enums = new Dictionary<decimal, Enum>();
_enums[1.1] = enum.enum1;
_enums[2.2] = enum.enum2;
_enums[3.3] = enum.enum3;
_enums[4.4] = enum.enum4;
//...etc
_enums[5000] = enum.enum5000;
}
}
静态实例放置在高频堆中。字典也有吗?或者也许有指向低频堆的指针?
创建默认大小的字典/数组并一次添加一个值时,字典必须反复调整自身大小。据我了解,它通过分配新内存并复制数据来做到这一点,而旧字典最终会被垃圾收集。但是如果不收集高频堆,这会导致数组的多个副本驻留在高频堆中吗?或者,如果 HF 堆只有指向 LF 堆的指针,它们是否不会因为 HF 堆中仍然存在引用而被收集?
编辑:感谢 Alexei Levenkov,这目前正在网络上运行,当调用此 GetEnum 时,我们遇到非常不寻常的内存不足异常会杀死我们的服务器。至于参考,这里有一些:
http://www.codeproject.com/Articles/15269/Static-Keyword-Demystified