0

我一直在对静态对象和高频与低频堆进行大量研究。我知道高频堆不是垃圾收集的。我的问题是,如果我将普通类中的数组或字典实例化为 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

高频堆

http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

4

0 回答 0