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);
}
}

浙公网安备 33010602011771号