我知道我有内存泄漏。我使用Winforms在C#中编写。基本上,我的程序有很多按钮。每隔.01秒,计时器类调用一个函数来从gps中获取gps数据。每次按下按钮,它都会与最新的gps点配对,并且它们都会被推送到数据库。我不知道泄漏在哪里。它可以与事件处理程序一起使用吗?每个按钮都有一个+ =但从不是 - =。或者当我将gps指向gui时,它可能会出现吗?我正在使用实体框架写入数据库。
谢谢,
杰施
编辑:
我知道这是一个内存泄漏,因为当我进入任务管理器时,我发现我的程序使用的内存一直在增加。此外,计时器不会像往常一样点火......从.01秒到约0.5秒。在自动生成的代码中,每个按钮都订阅(最后一行):
this.commentsGoButton.Location = new System.Drawing.Point(348, 23);
this.commentsGoButton.Name = "commentsGoButton";
this.commentsGoButton.Size = new System.Drawing.Size(67, 70);
this.commentsGoButton.TabIndex = 12;
this.commentsGoButton.Text = "Enter Comment";
this.commentsGoButton.UseVisualStyleBackColor = true;
this.commentsGoButton.Click += new System.EventHandler(this.commentsGoButton_Click);
另外,我正在调用此函数:
GPS gps1 = new GPS(Lat, Longi, Alt, Yaw, Pit, Rol);
info.takeInGPS(gps1);
str = Lat + " " + Longi + " " + Alt + " " + Yaw + " " + Pit + " " + Rol + " ";
gui.addToTextBox(str);
GPS是我所称的类。 GPS是从GPS接收点的类。它由GUI类中的计时器调用。 GPS将其传递给info以传递给数据库和GUI类以使用以下方式发布它:
public void addToTextBox(string s)
{
textBox.Text += s += "\r\n";
textBox.SelectionStart = textBox.TextLength; //scrolling stuff
textBox.ScrollToCaret();
}
信息这样做:
public void takeInGPS(GPS g)
{
gps = g;
write(gps);
}
哪些第三方程序会指出内存泄漏是什么?我能创建100个新GPS对象的事实可能会成为问题吗?我不是要覆盖它们吗?
答案 0 :(得分:3)
你可能不得不使用内存分析器来帮助你找到内存泄漏,如果有的话。我发现过去有用的一个这样的工具是免费CLR Profiler。您也可以下载documentation。它将为您提供分配内存的位置以及每种类型的分配情况。它非常易于使用。
我在其他地方看到的另一个是http://memprofiler.com/,但那个不是免费的(超出审判范围)。
答案 1 :(得分:2)
你的文章中没有任何内容真的尖叫“内存泄漏”。由于其他原因(例如让对象等待垃圾回收),进程的内存使用量可能会向上蔓延。
目前还不清楚您的问题是进行了多少数据库访问,以及在这种情况下“数据库访问”到底意味着什么。您可能需要确保数据库更新发生在与处理UI内容的单独线程中。虽然可能从您的UI线程进行数据库调用,但通常不是一个好主意。这可能是导致你放慢速度的原因。
您还应该确保您的GPS访问权限也与UI代码分开。每秒创建100个新对象不太可能导致内存问题,但请记住,任何访问某种硬件的调用可能需要比预期更长的处理时间。
最后一件事......你为什么每秒100次读取(或尝试)GPS设备?我无法想到任何有意义的场景。据我所知,典型的GPS设备每秒仅更新约1-5次。更频繁地阅读它并不能提供更好的结果。
答案 2 :(得分:0)
您是否清除了文本框中的文字或者您是否继续添加文本?每次向下一个框添加长度为M的新条目并且它已经有一个长度为N的字符串时,它将在执行连接时创建一个N + M长度的新字符串。如果这种情况经常更新并且您从未清除文本框,则会不断累积已分配的内存(其中大部分内容都有资格进行收集,但您仍会看到内存使用量增加。)
要对此进行测试,请尝试替换文本而不是附加文本,看看是否会改变观察结果。
答案 3 :(得分:0)
我的answer到popular question为您提供了各种分析选项。
如果您使用这些工具,您应该能够找到可疑内存泄漏的位置,并进行代码更改以解决它们。