Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net在高频堆和单例中静态分配阵列_C#_.net_Memory Leaks_Static_Heap - Fatal编程技术网

C# .net在高频堆和单例中静态分配阵列

C# .net在高频堆和单例中静态分配阵列,c#,.net,memory-leaks,static,heap,C#,.net,Memory Leaks,Static,Heap,我已经做了很多关于静态对象和高低频堆的研究。我知道高频堆不是垃圾收集的。我的问题是,如果我将普通类中的数组或字典实例化为web服务器中的静态实例: public class Lookup { private static readonly Lookup instance = new Lookup(); private Dictionary<Decimal, Enum> _enums; public static Enum GetEnum(Decimal va

我已经做了很多关于静态对象和高低频堆的研究。我知道高频堆不是垃圾收集的。我的问题是,如果我将普通类中的数组或字典实例化为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;
    }
}
公共类查找
{
私有静态只读查找实例=新建查找();
私人字典(enums),;
公共静态枚举GetEnum(十进制值)
{
返回实例。_枚举[值];
}
查找()
{
_enums=新字典();
_enums[1.1]=enum.enum1;
_enums[2.2]=enum.enum2;
_enums[3.3]=enum.enum3;
_enums[4.4]=enum.enum4;
//…等等
_enums[5000]=enum.enum5000;
}
}
静态实例被放置在高频堆中。字典也在那儿吗?或者可能有指向低频堆的指针吗?
当创建默认大小的字典/数组并一次添加一个值时,字典必须重复调整自身大小。据我所知,它是通过分配新内存和复制数据来实现的,而旧字典最终会被垃圾回收。但是,如果不收集高频堆,是否会导致阵列的多个副本驻留在高频堆中?或者,如果HF堆只有指向LF堆的指针,它们不会被收集,因为HF堆中仍然存在引用吗

编辑:谢谢Alexei Levenkov,这是目前在web上运行的,当调用此GetEnum时,内存不足异常会杀死服务器。关于参考文献,以下是一些:


解释将普通对象放置在高频堆上的链接(或仅指向获取此堆信息的位置的链接)将非常有用。另外,解释为什么它对代码很重要可能有助于解决这个问题。不,字典仍然在正常的GC堆中。只有引用是静态的。“对于这个问题,您找错了方向。@HansPassant好吧,当我将此更改为每次调用(移除静态)时都创建一个新实例时,它就开始工作了。”。另外,通过将其更改为带锁的延迟加载单例,它似乎也产生了不同。这很不寻常,因为它只被分配了一次,之后才被读取。