Autofac踩坑经历
背景
接口框架使用反射,动态生成Controller
,使用Autofac
进行依赖注入,并替换默认DependencyResolver
及IControllerFactory
,Controller
实例化代码如下
//创建controller
public IController CreateController(RequestContext requestContext, string controllerName)
{
try
{
string key = string.Format(ControllerKey + "Controller", requestContext.RouteData.Values["controller"]).ToLower();
var resolver = DependencyResolver.Current as AutofacDependencyResolver;
return resolver.GetServiceWithKey<IController>(key);
}
catch
{
return null;
}
}
//autofac resolver代码,container为IContainer
return container.ResolveKeyed<T>(key);
问题
上线没两天,却发现导致服务器内容只剩10%不到,dump内存,发现大量Controller
没有被回收。
即Aufofac.Core.Disposer
中的引用未释放,每次请求获取到的Controller
实例没有得到释放,导致内存越来越少。
但以前也有用到在数据库层和服务层的情况,并没有出现内存不回收的情况。
原因分析
查看源代码,发现这里面存的是所有IDisponse对象,以前使用的类都没有实现IDisponse,所有每次获取实例使用后,gc会自动回收。而在Autofac中,如果每次获取的对象不使用BeginLifeScope的话,Autofac则认为对象生命周期没结束,则不会去释放对象。
所以需要调整代码如下
using(var scope = container.BeginLifeScope())
{
scope.Resolve<T>();
}
总结
- 这些使用官网文档里面都有提到,所以第三方组件使用一定要仔细阅读文档。
- 虽然官网给出解决方案,但我觉得这种方式有点别扭,对生命周期可能会产生影响。所以我觉得底层应该加上自动释放的机制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?