GC.Collect 调用和 OutOfMemory

发布于 2024-12-09 08:56:51 字数 167 浏览 0 评论 0原文

当我调用 GC.Collect 时一切正常。但如果我评论这个调用,我时不时会收到 OutOfMemory 消息。看起来很奇怪。 如何找到这个bug?

附加信息 应用程序解决方案有一些项目引用了从2.0到4.0的不同框架 Aplication是一个windows窗体应用程序,使用的是devexpress。

When I call GC.Collect all works fine. But if I comment this call, I time from time receive OutOfMemory. Looks very strange.
How to find this bug ?

Additional info
Application sulution has some projects that have references to different frameworks from 2.0 to 4.0
Aplication is a windows forms application, devexpress is used.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

╰つ倒转 2024-12-16 08:56:51

最可能的变体:

  1. 大对象堆碎片。在应用程序中使用了大量的集合,其大小高达百万个元素,例如HashSet、Dictionary等。它们都会时不时地调用Array.Resize。所以,GC.Collect并没有解决问题,只是减慢了碎片速度。
  2. 非托管代码

编辑:
3. System.Drawing在某些情况下容易抛出OOM异常

The most likely variants:

  1. Large Object Heap fragmentation. In the application is used very big amount of collections of big size up to million elements, such as HashSet, Dictionary and etc. All of them call Array.Resize from time to time. So, GC.Collect does not solve the probem, just slows down the fragmentation.
  2. unmanaged code

Edited:
3. System.Drawing tends to throw OOM exception in some cases

残月升风 2024-12-16 08:56:51

您可能忘记处理某个物体。您使用任何数据库或其他外部资源吗?

You probably forget to dispose an object. Do you use any databases or other external resources?

夕嗳→ 2024-12-16 08:56:51

如果您必须调用 GC.Collect,那么就有问题了。您通常不需要调用垃圾收集器。

  1. 尝试内存分析器。这将显示有多少类型的对象消耗了您的堆。
  2. 检查您的非托管资源。每个非托管资源都必须由实现 IDispoable 的类与终结器一起管理。

If you have to call GC.Collect then something is wrong. You usually should not need to call the garbage collector.

  1. Try a memory profiler. This will show you how many objects of what type consume your heap.
  2. Check your unmanaged ressources. Every unmanaged resource has to be managed by a class implementing IDispoable in conjunction with a finalizer.
深海不蓝 2024-12-16 08:56:51

在 .net 中调试内存泄漏的常见方法是使用 SOS -扩展(你会发现一些教程,例如这个(如果您做了一些研究)或使用内存分析器,例如 这个。也许您只是忘记释放(处置)一些非托管资源?

A common approach to debug memory leaks in .net is to use the SOS-Extension (you'll find some tutorials like this if you do some research) or to use a memory profiler, like this one. Maby you just forget to release (dispose) some unmanaged ressources?

-黛色若梦 2024-12-16 08:56:51

我会尝试使用 CLR 分析器 调试托管内存问题。

另外,你为什么自己调用 GC.Collect() ?这通常是一种反模式。

I would try debugging managed memory issues with the CLR profiler.

Additionally, why are you calling GC.Collect() yourself? This is usually an anti-pattern.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文