【发布时间】:2017-03-31 10:43:29
【问题描述】:
我正在使用 C# 和 .NET Framework 4.6.2 和 Entity Framework 6.1.3 开发 Windows 服务。
我在该服务上有一个 Web API 接口,并在一个控制器的方法中创建了一个包含超过一百万个字符串的字典:
Dictionary<string, List<string>> codes;
这个字典是在另一个方法中创建的:
codes = GetCodesAsDictionary(connectionString, productionId);
我将此变量从静态类传递给静态方法。
一个 Visual Studio 2015 的内存分析器我看到调用此方法时内存如何增长到 1.1Gb,但是当方法结束时,内存保持为 1.1Gb。
如果我再次调用该方法,内存再次增长到 2Gb,并且在方法完成后,内存再次变为 1,1Gb。
我尝试将codes 变量作为参考传递,但我得到了相同的内存分配。我必须停止该服务并再次重新运行它以释放该 1,1Gb。顺便说一句,我通过引用传递它,因为我不希望静态方法复制它。
你知道为什么它在方法结束后没有释放这么多的内存吗?
更新:
我已经用实例类更改了静态类(从静态类复制方法),我得到了相同的结果(分配了 1.1Gb 内存)。
第二次更新:
我还更改了字典的创建方式:
Dictionary<string, List<string>> codes = null;
GetCodesAsDictionary(connectionString, productionId, out codes);
我得到相同的结果:分配了 1,1Gb 内存。
第三次更新:
我用KeyValuePair<byte, string[]>[] 更改了Dictionary,我得到了相同的结果,分配了1,1Gb。现在,我不使用string 作为键,而是使用字节。
【问题讨论】:
-
在错误的地方搜索答案后的一个基本问题。代码变量的范围是什么。
-
我不知道这个,但是一些收集器将大对象分配在一个永久子空间中,其中没有任何对象被收集。
-
我更新了我的问题,提供了更多细节。
标签: c# memory memory-leaks garbage-collection