2

我知道我有内存泄漏。我正在使用 Winforms 用 C# 编写。基本上,我的程序有很多按钮。每 0.01 秒,计时器类调用一个函数以从 gps 获取 gps 数据。每次按下按钮时,它都会与最近的 gps 点配对,并将它们都推送到数据库。我不知道泄漏在哪里。可能与事件处理程序有关吗?每个按钮都有一个+=,但从来没有一个-=。或者当我将 gps 指向 gui 时可能是这样吗?我正在使用实体框架写入数据库。

谢谢,

杰西

编辑:我知道这是内存泄漏,因为当我进入任务管理器时,我看到我的程序使用的内存一直在增加。此外,计时器的触发频率不会越晚……从 0.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); }

哪些 3rd 方程序会指出内存泄漏在哪里?我每秒创建 100 个新 GPS 对象这一事实是否会成为问题?我不是在覆盖它们吗?

4

4 回答 4

3

如果确实存在内存泄漏,您可能必须使用内存分析器来帮助您找到内存泄漏。我过去发现其中一个有用的工具是免费的CLR Profiler。您也可以下载它的文档。它将为您提供内存分配位置的图片,以及每种类型分配了多少内存。它很容易使用。

我在其他地方看到的另一个是http://memprofiler.com/,但那个不是免费的(在试用版之外)。

于 2013-05-24T22:29:37.010 回答
2

您的帖子中没有任何内容真正尖叫“内存泄漏”。一个进程的内存使用可能会因为其他原因而增加,例如让对象等待垃圾回收。

从您的问题中不清楚有多少数据库访问正在进行,以及在这种情况下“数据库访问”到底意味着什么。您可能需要确保您的数据库更新发生在与处理您的 UI 内容的线程不同的线程中。虽然可以从 UI 线程进行数据库调用,但这通常不是一个好主意。这可能是导致您减速的原因。

您还应该确保您的 GPS 访问也位于与您的 UI 代码不同的线程中。每秒创建 100 个新对象不太可能导致内存问题,但请记住,任何访问某种硬件的调用可能需要比您预期的更长的时间来处理。

最后一件事……你为什么要每秒读取(或尝试)100 次 GPS 设备?我想不出任何有意义的场景。据我所知,典型的 GPS 设备每秒仅更新 1-5 次。更频繁地阅读它不会提供任何更好的结果。

于 2013-05-24T23:20:33.370 回答
0

您是否曾经清除文本框中的文本,或者您只是继续附加它?每次你将一个长度为 M 的新条目添加到下一个框并且它已经有一个长度为 N 的字符串时,它会在执行连接时创建一个长度为 N + M 的新字符串。如果此更新非常频繁并且您从不清除文本框,这将不断累积分配的内存(其中大部分将符合收集条件,但您仍会看到内存使用量增加。)

要对此进行测试,请尝试替换文本而不是附加文本,看看这是否会改变您观察到的结果。

于 2013-05-24T23:49:08.170 回答
0

我对一个热门问题的回答为您提供了各种分析选项。

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

于 2013-05-24T23:58:08.867 回答