无法在C#Winforms中找到内存泄漏

时间:2013-05-24 21:50:37

标签: c# winforms memory-leaks

我知道我有内存泄漏。我使用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对象的事实可能会成为问题吗?我不是要覆盖它们吗?

4 个答案:

答案 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)

我的answerpopular question为您提供了各种分析选项。

如果您使用这些工具,您应该能够找到可疑内存泄漏的位置,并进行代码更改以解决它们。