代码之家  ›  专栏  ›  技术社区  ›  JayPea

使用远程性能监视器帮助查找泄漏

  •  1
  • JayPea  · 技术社区  · 14 年前

    我正在尝试使用远程性能监视器在紧凑的框架应用程序中查找内存泄漏的源。我设法删除了一些与画笔和其他图形对象相关的小问题,但我仍然不清楚是什么导致了主要问题。

    此时,似乎永远不会返回到原始计数的唯一对象是System.String对象。我觉得这很奇怪,因为我本以为为了让这些对象保持未收集状态,包含它们的对象也必须保持不变,但似乎没有其他类型的对象随着System.string而增加。

    我试图找出哪些新的字符串对象是应用程序返回其原始状态(即登录屏幕)后仍然存在的对象。问题是,最初,应用程序加载了大约2200个字符串对象,然后在处理“X”之后,它又增加了大约70个从未收集到的对象。我不知道如何识别这70个新物体,以便找出谁在抓住它们,并作出适当的更正。

    有没有人有过不收集琴弦的经验?是否有任何方法可以将进程“X”期间创建的新对象与应用程序最初需要的对象分开,以便我可以知道哪些对象正在泄漏?任何建议都将不胜感激。

    谢谢

    **更新

    好 啊。。。发生了一件很奇怪的事。我开始怀疑是否有泄漏。

    假设我在登录屏幕上拍摄了一个内存快照,这是应用程序的原始起点。假设此时内存中有1000个字符串对象。现在,如果我登录并从菜单中选择一个选项,我将在加载新屏幕后拍摄快照。假设加载这个表单会增加字符串的数量,比如说50个对象。当我注销并在登录屏幕上再次拍摄快照时,这些对象中只有25个被收集,其余的将从此留在内存中。

    奇怪的是,如果我继续重复这个过程,就不会有更多的字符串对象积累。与字符串计数增加50不同的是,此时只会添加25个字符串,当我返回到登录屏幕时,将收集相同的25个字符串。我在想,如果这是一个真正的泄漏,那么每次我打开屏幕时,字符串计数将永久性地增加25,但这只是第一次发生。

    在我打开的每一个新屏幕上都会发生这种情况。一开始,整个字符串计数有一个小的永久性的增加,但是一旦我加载了那个特定的屏幕,在它执行期间的任何字符串计数的增加都将在我返回到登录屏幕时被收集起来。

    所有这些都让我相信,也许这些字符串是CLR内部工作的一部分或类似的东西。可能是运行时做的某种缓存吗?也许它是在存储我的字符串常量以便更快地加载?像那样?我希望这不会太混乱。

    1 回复  |  直到 14 年前
        1
  •  0
  •   ctacke    14 年前

    如果使用CF3.5,则使用 the CLR Profiler 而不是转速。它将显示所有对象和产生它们的根。它将允许您返回根目录树,找出它们的分配位置。

    编辑

    所以你是说你实际上没有得到OOM或任何异常行为?听起来你是想在没必要的时候优化一下。这些字符串很可能是抖动创建的表单标题等,如果/当对象被收集时,这些字符串将被收集。不过,如果你没有真正看到记忆问题,它们到底是什么并不十分重要。