asp.net 应用占用内存过大如何排查?

公司里有几个应用,偶尔会出现内存占用非常大的情况,都是内部办公应用,使用的人不是很多,但是出现内存占用非常大的情况。我使用dotmemory时出现过非…
关注者
85
被浏览
9,529
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

概述

.NET中托管内存在使用完毕后会在合适的时机被垃圾回收,非托管的内存则不会被自动回收,如果这些非托管的资源没有释放或者及时释放,程序长时间运行会导致内存慢慢被占满直到程序崩溃.

.NET中常见的内存泄漏主要有以下三种:

1、静态变量泄露

静态变量中的成员所占用的内存如果不手动处理是无法自动释放的,如单例模式;

临时加更干货分享

大家能看到这里,已是对我们的支持了。 分享一组2023年2月录制的C#零基础教程。 我们喜欢做这样的分享,它足够的基础,对新手友好。如果需要的话,就来免费领取吧!

资料免费自取:

由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴,点击下方卡片!

也可点击下方卡片: 点击后自动复制威芯号,并跳转到威芯。搜索威芯号添加,内容已做打包, 备注知乎

即可免费领取,注意查收!

2、非托管资源泄露:非托管资源不会自动回收,使用完成后需要手动释放,一般是通过实现dispose仿作实现释放,dispose一般写法如下:

public class SampleClass : IDisposable
    //演示创建一个非托管资源
    private IntPtr nativeResource = Marshal.AllocHGlobal(100);
    //演示创建一个托管资源
    private Test test = new Test();
    private bool disposed = false;
    /// <summary>
    /// 实现IDisposable中的Dispose方法
    /// </summary>
    public void Dispose()
        //必须为true
        Dispose(true);
        //通知垃圾回收机制不再调用终结器(析构器)
        GC.SuppressFinalize(this);
    /// <summary>
    /// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
    /// </summary>
    public void Close()
        Dispose();
    /// <summary>
    /// 必须,以备程序员忘记了显式调用Dispose方法
    /// </summary>
    ~SampleClass()
        //必须为false
        Dispose(false);
    /// <summary>
    /// 非密封类修饰用protected virtual
    /// 密封类修饰用private
    /// </summary>
    /// <param name="disposing"></param>
    protected virtual void Dispose(bool disposing)
        if (disposed)
            return;
        if (disposing)
            // 清理托管资源
            if (test != null)
                test.Dispose();
                test = null;
        // 清理非托管资源
        if (nativeResource != IntPtr.Zero)
            Marshal.FreeHGlobal(nativeResource);
            nativeResource = IntPtr.Zero;
        //让类型知道自己已经被释放
        disposed = true;
    public void SamplePublicMethod()