Loading

C#中的图片释放

C#中的图片释放

场景

在公司项目中,由于采用并发请求图片,使用到 System.Drawing较多,其中 Image、Bitmap、Graphics使用最为频繁。

优化措施与发现

  • Image为抽象类,在使用ref返回时,如果释放,需要确认好后续对象接收输出后,前置对象byte、memorysteam等再释放,否则Image可能为null。
  • Image释放,使用Dispose(),即可进入垃圾回收。使用 =null 对内存回收没有作用

Dispose的使用

  • 默认使用Dispose()释放托管,如涉及到释放非托管使用Dispose(Boolean)
  • 继承IDisposable ,才有Dispose可用

内存回收主题资料

-垃圾回收专题
-应用程序域资源监控
-垃圾回收的基本知识

内存监控代码

开销监控

static void GetCost(string appName)
{
    using (var p1 = new PerformanceCounter("Process", "Working Set - Private", appName))
    {
        Log4Net.Logger.Info("Used memory:" + (p1.NextValue() / 1024 / 1024).ToString("0.0") + "MB");
    }
}

开销销毁,注意,如没有接触占用,调用下方方法内存没有特别明显的变化。

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);

public static void ClearMemory()
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    if (Environment.OSVersion.Platform == PlatformID.Win32NT)
    {
        SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
    }
}
posted @ 2021-05-12 14:32  ChrisLeon  阅读(834)  评论(0)    收藏  举报