首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何监控C#中的内存泄漏?

如何监控C#中的内存泄漏?
EN

Stack Overflow用户
提问于 2013-05-02 00:35:28
回答 3查看 1.2K关注 0票数 0

我正在尝试做内存泄漏的可视化C#。我使用了以下代码:

代码语言:javascript
运行
复制
class Program
{
    static void Main(string[] args)
    {
        List<float> s = new List<float>();
        while (true) {
            s.Add(10 ^ 10);
        }
    }
}

我运行了这个程序,在2分钟内,我得到了OutofMemory异常。这是内存泄漏的真实代码吗?我在监控主内存空间,它有足够的空间。如果这是内存泄漏,那么即使在内存中有空间,是什么导致了这个内存泄漏呢?我如何监控这个泄漏?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-02 01:56:30

你的例子不是内存泄漏,你会耗尽内存,但你创建的所有对象都可以被运行的程序访问。泄漏是在内存中有无法访问的对象时发生的。下面是一个可能是导致.NET泄漏的最常见原因的示例,即订阅静态事件:

代码语言:javascript
运行
复制
internal class Program
{
    public static event EventHandler SomeStaticEvent;

    private static void Main()
    {
        while (true)
        {
            var a = new A();                

            //here a goes out of scope but won't be collected by GC because Program still holds reference to "a" by a static event subsription
        }
    }      
    public class A
    {                       
        public A()
        {
            //if you comment this line, there is no reference from Program to A and a will be GC-ed and memory allocated will be released
            Program.SomeStaticEvent+=ProgramOnSomeStaticEvent;
        }
        private void ProgramOnSomeStaticEvent(object sender, EventArgs eventArg){}
    }

}

在订阅静态事件或长生命对象的事件时要小心。您的程序正在泄漏,并且很难找出原因。在对象超出作用域之前,始终取消订阅此类事件。

票数 2
EN

Stack Overflow用户

发布于 2013-05-02 00:41:10

这不是内存泄漏。您添加的每个数字仍然可以从您的列表对象访问。您的代码只是使用了大量内存,最终会耗尽内存。

您可能正在访问the maximum amount of memory for a single object

垃圾回收器将确保在不再有对对象的引用时释放与该对象相关联的内存。

票数 5
EN

Stack Overflow用户

发布于 2013-05-02 01:01:21

你希望s.Add做什么?每次执行时,它都会在列表中添加一个新元素。所以第一次,你会有一个只有一个元素的列表,第二次s是一个有两个元素的列表,第一百万次它会有一百万个元素。它将一直这样运行,直到它太大而无法放入内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16322351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档