【问题标题】:Memory keeps allocated after method ends方法结束后内存保持分配
【发布时间】: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&lt;byte, string[]&gt;[] 更改了Dictionary,我得到了相同的结果,分配了1,1Gb。现在,我不使用string 作为键,而是使用字节。

【问题讨论】:

  • 在错误的地方搜索答案后的一个基本问题。代码变量的范围是什么。
  • 我不知道这个,但是一些收集器将大对象分配在一个永久子空间中,其中没有任何对象被收集。
  • 我更新了我的问题,提供了更多细节。

标签: c# memory memory-leaks garbage-collection


【解决方案1】:

你知道为什么方法结束后它没有释放这么多的内存吗?

如果不再有任何引用,可能只是垃圾收集器没有释放该内存的冲动,即使它不再使用了。

您可以尝试force garbage collection 看看内存是否被释放。如果没有,您的代码可能有问题。

(旁注:如果您在字符串中有大量重复,您可能会从实习中受益。这将大大减少内存压力。但是,这将始终保持这些字符串的分配。)

【讨论】:

  • 谢谢。垃圾回收仅释放 150Mb。
【解决方案2】:

您确定字典是在该方法中创建和使用的吗?

如果没有其他帮助,您可以尝试使用GC.Collect(),但这只能作为最后的手段。

https://msdn.microsoft.com/en-us/library/system.gc.collect(v=vs.110).aspx

编辑:您可以尝试使用GC.AddMemoryPressure 方法而不是我之前推荐的方法。您需要传递 Memory 的数量,以使 GC 知道有一些内存可以被收集。

https://msdn.microsoft.com/en-us/library/system.gc.addmemorypressure(v=vs.110).aspx

尝试以下方法是否适合您:

Dictionary<string, List<string>> codes = new Dictionary<string, List<string>>();
long bytesBefore = GC.GetTotalMemory(true);

// Code that adds items to your dictionary comes here

long bytesAfter = GC.GetTotalMemory(true);

// After your method ends:
GC.AddMemoryPressure((long) (bytesAfter - bytesBefore));

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 2015-07-31
    • 2021-08-23
    • 2013-09-07
    • 1970-01-01
    • 2017-06-10
    • 2012-07-08
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多