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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧