C#Windows窗体中应用程序的内存问题

时间:2011-05-22 17:13:36

标签: c# winforms memory-leaks memory-management timeline

我在C#中有一个应用程序,它不应该保留太多内存。可执行文件大约100Kb,整个应用程序是几千行代码 它是主要组件,有一个计时器,负责创建事件(具有几个属性的类的实例)并将它们发送到此http://timeline.codeplex.com/。时间轴接受事件的方式是调用ResetEvents函数并传递事件列表。因为我有一个计时器,我把它放在计时器的代码中 像这样运行它,应用程序上升到300Mb的内存,我只是结束它以避免崩溃。如果我从计时器中删除ResetEvents的调用,那么应用程序运行更平稳,消耗60-70Mb。没有时间线的应用程序应该在10-20Mb运行。没有图形或任何可能使用更多的东西。我的猜测是时间轴可能有问题。

编辑:

以下是代码的一部分:

List<TimelineEvent> events = new List<TimelineEvent>();

...

内部计时器

TimelineLibrary.TimelineEvent newevent = new TimelineLibrary.TimelineEvent();
...
newevent.StartDate = starttime;
newevent.EndDate = endtime;
newevent.Id = id;
newevent.Title = title;
newevent.Description = description;
newevent.Link = url;
newevent.EventColor = color;

events.Add(newevent);

timeline.ResetEvents(events);

...

此代码位于计时器内。我只是创建一个TimelineEvent,将其添加到列表并调用ResetEvents。删除最后一行不会导致内存问题。

2 个答案:

答案 0 :(得分:2)

由于在没有更多代码的情况下很难看出你的问题是什么,我建议尝试使用某种内存分析器来查找内存分配的位置和时间。

试着举例RedGates Memory Profiler,他们有一个基于时间的审判 按照walk-through进行操作,快速了解一下要查找的内容和方法。

有关.NET内存分析器的更多选项,请参阅this thread

祝你好运!

答案 1 :(得分:0)

您传递给events的{​​{1}}变量的类型是什么?

在没有看到代码的情况下,我在你发布的内容中唯一可疑的行为是,ResetEvents方法可能并没有真正清除它收到的集合,而是对{{{{{{ 1}}变量。

使用内存分析器是一个好主意。如果您希望此处的人员帮您找到内存泄漏,请发布更多代码。理想情况下,您可以使用最少的代码重现问题,然后发布。