【问题标题】:Memory Leaks C# .Net内存泄漏 C# .Net
【发布时间】:2022-12-06 09:32:17
【问题描述】:

内存泄漏是否取决于机器配置?

我有一个 32 位 .Net 应用程序在 Windows 10 和 Windows 7 中运行。我在 Windows 10 中没有遇到任何内存泄漏,但在 Windows 7 中。

任何差异,请给出一些清晰度。

【问题讨论】:

  • 我怀疑这种说法。你怎么知道有内存泄漏?如果您想知道是否存在内存泄漏,则必须执行完整的 GC 收集并确保实例在 GC 循环后不断增长并且不会消失。

标签: c# .net memory-leaks


【解决方案1】:

内存泄漏比这更复杂。

本质上,内存泄漏要么是未收集的遗忘内存。 或者我们的程序持有的未被释放的内存。

现在它变得更复杂了。 在 .Net 应用程序中,您有本机内存和托管内存,您可以同时泄漏它们! 非托管内存通常由库初始化(除非您有显式分配),因此您可能会关注您的情况下的托管内存。 托管内存是通过引用保存分配的类。

所以如果我有这段代码,它可能会“泄漏”:

class MyClass
{
  static int[] MyVariable;

  static MyClass() 
  {
    MyVarialbe = new int[5000000];
  }

}

在 .Net GC 中有一个叫做“根”的东西,它是决定收集哪些对象的参考树的开始。 了解之后 - 您需要了解并描述您遇到的是哪种“内存泄漏”。 我的猜测是您看到内存不时上升并且从未释放?

.Net 应用程序很广泛,所以您必须解释它在做什么,它是什么类型的应用程序,以及您看到了什么样的内存泄漏。

有很棒的工具可以检查它,JetBrains 的分析器,Visual Studio 也有很好的分析器。 如果您能够调整,您可以检查托管堆并查看占用大量内存的内容。


另一个关键点是看你使用的是什么操作系统,你提到了 Win 7 和 Win 10 但你没有提到它们的位数,它们是 32 位还是 64 位? 内存管理器 (Windows) 在 32 位或 64 位方面做了一些不同的事情,具体取决于您的操作系统版本。

也许您看到的内存泄漏是加载了额外的库? 为此,您可以使用 VMMap (Sysinternals) 等工具来检查您的虚拟内存。

【讨论】:

  • 嗨,它是 32 位的。
  • @KYugandharReddy 32 位应用程序最多消耗 2GB(最多扩展 3-4),因此您需要确定您面临的泄漏类型,是由于用户代码造成的泄漏,还是不在您身边的库.如果不了解全部细节,我无法真正帮助您,但我的评论应该对开始调试此问题有用。
猜你喜欢
  • 2011-03-22
  • 2012-02-19
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多