【发布时间】:2023-03-30 17:17:01
【问题描述】:
这是我正在玩的一个小型控制台程序,用于找出我的生产应用程序消耗过多内存的原因:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
Console.WriteLine("Press key - 1"); Console.ReadLine();
var q = new Queue<string>();
for (int i = 0; i < 1000000; i++)
q.Enqueue("test string" + i);
Console.WriteLine("Press key - 2"); Console.ReadLine();
q = null;
Console.WriteLine("Press key - 3"); Console.ReadLine();
GC.Collect();
Console.WriteLine("Press key - 4"); Console.ReadLine();
GC.Collect(2);
Console.WriteLine("Press key - 5"); Console.ReadLine();
}}}
我正在运行它并在按下键的同时监视 Windows 任务管理器。这是我在每个步骤的内存列中看到的内容:
- 4 700K
- 61 616K
- 61 596K
- 10 588K
- 8 588K
每次运行的结果略有不同(只有几 Ks),但您明白了。有人可以解释一下这里发生了什么吗?
我的环境:.NET4(客户端配置文件),Windows 7 x64。
【问题讨论】:
-
没有投反对票,但是:这是垃圾收集,您正在向队列添加大量数据。仅仅因为您将其设置为
null并不意味着它消耗的内存会立即被释放。通过强制 GC 运行,您可以将其删除(尽管这是一个坏主意)。 GC 将在需要时运行。 -
谢谢!为什么在第 5 步我仍然消耗的内存是第 1 步的 2 倍?
-
很难说,因为内存总量并没有告诉你任何关于消耗它的东西。可能是额外的程序集负载或被分页的框架的其他部分。您是在查看 VM 使用情况还是 RAM 使用情况?
-
进程消耗的RAM使用量
-
在探索内存“泄漏”和其他性能问题时,请尝试使用性能和内存分析器。见this question。
标签: .net memory memory-leaks garbage-collection