高并发下Autofac抛出System.OutOfMemoryException问题求助
Autofac高并发下Disposer栈溢出问题排查与解决
问题背景
我们采用ASP.NET MVC Web API架构,使用Autofac(版本4.9.4)作为依赖注入容器。在高API请求量场景下,频繁抛出以下异常:
An error occurred while processing request: System.InvalidOperationException: An error occurred when trying to create a controller of type 'PortalControllerV1'. Make sure that the controller has a parameterless public constructor. ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating PortalControllerV1 -> Entities.PasswordPolicyHelper. ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(IoC.Services.IAppSettingsProvider, IApplicationLazyCache)' on type 'PasswordPolicyHelper'. ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating ?:Configuration.RemoteSyncConfigurationRoot. ---> System.OutOfMemoryException: Array dimensions exceeded supported range. at System.Collections.Generic.Stack`1.Push(T item) at Autofac.Core.Disposer.AddInstanceForDisposal(IDisposable instance) in C:\projects\autofac\src\Autofac\Core\Disposer.cs:line 78 at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget) in C:\projects\autofac\src\Autofac\Core\Resolving\InstanceLookup.cs:line 145 at Autofac.Core.Resolving.InstanceLookup.Execute() in C:\projects\autofac\src\Autofac\Core\Resolving\InstanceLookup.cs:line 83 at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\Core\Resolving\ResolveOperation.cs:line 131 at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) in C:\projects\autofac\src\Autofac\ResolutionExtensions.cs:line 1041 at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\ResolutionExtensions.cs:line 871 at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\ResolutionExtensions.cs:line 300
我们推测是Autofac Disposer的栈超出了支持范围,请问该如何解决?这是否属于Autofac的bug?
问题原因分析
从异常栈可以看到,OutOfMemoryException触发于Stack<T>.Push操作,结合Autofac的Disposer实现逻辑,核心原因是Disposer中待释放的实例栈无限增长,在高并发场景下超出了CLR对数组维度的限制。
这种情况通常不是Autofac的原生bug,更可能是业务代码的依赖配置或生命周期管理存在问题:
- 单例(Singleton)组件依赖了请求生命周期(InstancePerRequest)的组件,导致请求级实例被单例长期持有,无法正常释放,不断堆积到Disposer栈中。
- 组件间存在循环依赖,导致实例无法被正确回收,Disposer持续添加待释放实例。
- Autofac 4.9.4是2019年的旧版本,存在一些已在后续版本中修复的生命周期管理、并发场景下的边缘问题。
解决步骤
- 检查依赖生命周期配置
排查所有单例组件的依赖链,确保没有直接或间接引用请求级、临时(InstancePerDependency)的可释放组件。若必须引用,使用Owned<T>或工厂模式手动管理依赖的生命周期,避免单例持有请求级实例。 - 修复循环依赖
梳理PasswordPolicyHelper、RemoteSyncConfigurationRoot等组件的依赖关系,确认是否存在循环依赖。可通过将构造函数注入改为属性注入,或引入中间服务层来打破循环。 - 升级Autofac版本
升级至Autofac最新稳定版本(当前已迭代至6.x系列),新版本修复了大量生命周期管理和并发场景下的问题,包括Disposer的内存管理优化。升级时需同步适配ASP.NET MVC Web API的集成包(Autofac.WebApi2)。 - 优化组件释放逻辑
若暂时无法升级版本,可对不需要Autofac管理释放的组件,注册时添加ExternallyOwned()标记,避免其被加入Disposer待释放栈。 - 定位堆积实例
使用性能监控工具(如PerfView)跟踪Disposer栈的增长情况,定位具体是哪个组件导致实例堆积,针对性修复。
是否为Autofac的bug?
绝大多数场景下,这类问题是业务代码的依赖配置错误导致的,而非Autofac的原生bug。但旧版本的Autofac在并发场景下的生命周期管理确实存在一些边缘case问题,若升级版本后问题消失,则说明是已修复的旧版本bug。
内容的提问来源于stack exchange,提问作者Dark_Knight
相关产品推荐
相关产品推荐

