我正在尝试诊断Azure Web应用程序上的内存泄漏。
我使用诊断和解决问题>诊断工具>收集内存转储(工具引用这里)。
这将收集dmp文件并生成分析报告。我可以在崩溃Hang中看到线程和其他信息,但是DotNetMemoryAnaysis总是出错
Type: System.OutOfMemoryException
Message: Exception of type 'System.OutOfMemoryException' was thrown.
Stack Trace:
DebugDiag.DotNet.NetDbgObj.d__73.MoveNext()
System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
System.Linq.GroupedEnumerable`3.GetEnumerator()
System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
System.Linq.Buffer`1..ctor(IEnumerable`1 source)
System.Linq.OrderedEnumerable`1.d__1.MoveNext()
System.Linq.Enumerable.d__25`1.MoveNext()
System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
DebugDiag.AnalysisRules.DotNetMemoryAnalysis.GCRootWalker.ShowRoots(NetScriptManager manager, NetDbgObj debugger, NetProgress progress, IEnumerable`1 top40Query) in C:\src\DebugDiag\Development\src\DebugDiag.AnalysisRules\DotNetMemoryAnalysis.cs:line 1875
DebugDiag.AnalysisRules.DotNetMemoryAnalysis.DoDotNetMemoryAnalysis() in C:\src\DebugDiag\Development\src\DebugDiag.AnalysisRules\DotNetMemoryAnalysis.cs:line 222
DebugDiag.AnalysisRules.DotNetMemoryAnalysis.RunAnalysisRule(NetScriptManager manager, NetProgress progress) in C:\src\DebugDiag\Development\src\DebugDiag.AnalysisRules\DotNetMemoryAnalysis.cs:line 182
DebugDiag.DotNet.NetAnalyzer.RunAnalysisRulesInternal(DumpFileType bitness, NetProgress progress, String symbolPath, String imagePath, String reportFileFullPath, Boolean twoTabs, AnalysisModes analysisMode)我试着用dotnet-dump cli工具来分析文件,但是使用SOS does not support the current target architecture 0x0000014c的任何分析操作都会出错。在Visual中打开dmp似乎也不提供任何分析选项,只提供调试。
有什么方法可以从另一台机器对dmp进行分析吗?我应该用不同的方式收集垃圾堆吗?
更新
windows上的蔚蓝web应用程序使用的分析工具可以在https://www.microsoft.com/en-us/download/confirmation.aspx?id=58210下载。
但这并没有解决我的问题。我仍然有一个内存不足的异常。
我监控了系统内存的使用情况,但它从来没有达到顶峰。
增加GCRootTimeout在Program Files\DebugDiag\AnalysisRules\DebugDiag.AnalysisRules.dll.config中的含量。
我还在我能找到的每个配置文件中设置了gcAllowVeryLargeObjects。
发布于 2020-10-14 16:19:33
谢谢你分享你的转储文件@farlee2121。我使用WinDbg打开了您的转储文件,并启动了!analyze -v。这将把可用的符号拉到本地缓存中。
SYMSRV: BYINDEX: 0x1D
https://msdl.microsoft.com/download/symbols
SOS_x86_x86_4.8.4180.00.dll
5E7D1ED77b0000
SYMSRV: PATH: C:\debug\sym\SOS_x86_x86_4.8.4180.00.dll\5E7D1ED77b0000\SOS_x86_x86_4.8.4180.00.dll
SYMSRV: RESULT: 0x00000000
DBGHELP: C:\debug\sym\SOS_x86_x86_4.8.4180.00.dll\5E7D1ED77b0000\SOS_x86_x86_4.8.4180.00.dll - OK当试图查看堆时,!dumpheap -stat导致了.
Object <exec cmd="!ListNearObj /d 5cdcf038">5cdcf038</exec> has an invalid method table.
0:000> !ListNearObj /d 5cdcf038
Before: 5cdcf014 36 (0x24) System.Collections.Hashtable+HashtableEnumerator
After: couldn't find any object between 0x5cdcf038 and 0x5cdd00cc
Heap local consistency not confirmed....which可以指示GC可能在收集转储时运行。在这一点上我们可以做两个选择。一种是使用mex扩展并运行!mex.dumpheap2或使用PerfView来分析堆。
Mex显示了相当数量的Automapper对象
1,014,591 20,291,820 System.Linq.Expressions.FullConditionalExpression
2,873 24,391,820 System.Char[]
1,541,328 24,661,248 System.Linq.Expressions.AssignBinaryExpression
1,680,035 26,880,560 AutoMapper.Mappers.ConvertMapper+<>c__DisplayClass1_1
1,571,447 31,428,940 System.Linq.Expressions.LogicalBinaryExpression
1,680,036 33,600,720 System.Lazy<System.Linq.Expressions.LambdaExpression>
1,194,017 33,941,972 System.Linq.Expressions.Expression[]
3,161,253 37,935,036 System.Linq.Expressions.ConstantExpression
9,941 39,286,832 System.Collections.Generic.Dictionary+Entry<AutoMapper.TypePair,System.Lazy<System.Linq.Expressions.LambdaExpression>>[]
844,692 39,384,092 System.Reflection.MemberInfo[]
665,549 47,919,528 AutoMapper.PropertyMap
1,680,036 53,761,152 System.Func<System.Linq.Expressions.LambdaExpression>
253,050 58,765,632 System.Int32[]
339,941 61,674,100 System.String
25,206 70,703,012 System.Byte[]
Total 37,374,335 Object(s), Total Size: 1.03 GB, Free Objects 812(352.21 KB)如果您使用Perfview打开转储和转储GC堆,我们可以获得更好的图片。
Name Inc % Inc
LIB <<System.Core!Linq.Expressions.Expression>>> 21.8 214,783,296
+ AutoMapper!AutoMapper.TypeMap 21.8 214,783,296
+ LIB <<mscorlib!Dictionary>> 21.8 214,783,296
|+ AutoMapper!AutoMapper.MapperConfiguration 21.8 214,783,296
||+ AutoMapper!AutoMapper.Mapper 21.8 214,783,296
|||+ Fourstarzz.Accessors!Fourstarzz.Accessors.EntityFramework.DtoMapper 21.8 214,783,296
||||+ Fourstarzz.Accessors!Fourstarzz.Accessors.IntegrationAccessInfoAccessor 21.8 214,783,296
|||||+ Fourstarzz.Managers!Fourstarzz.Managers.Identity.AccountConnectionManager 10.9 108,058,320
||||||+ Fourstarzz.Managers.Adapters!Fourstarzz.Managers.Adapters.Identity.OkanjoRegistrationHandler 10.9 108,058,320
|||||| + Fourstarzz.Managers.Adapters!Fourstarzz.Managers.Adapters.Identity.CompositeIdentityEventHandler 10.9 108,058,320
|||||| + Fourstarzz.Managers!Fourstarzz.Managers.Identity.UserIdentityManager 10.9 108,058,320
|||||| + Fourstarzz.Clients.Website!Fourstarzz.Clients.Website.IdentityWrapper 10.9 108,058,320
|||||| |+ LIB <<System!Stack<Object>>> 10.9 108,058,320
|||||| | + Autofac!Autofac.Core.Disposer 10.9 108,058,320
|||||| | + Autofac!Autofac.Core.Lifetime.LifetimeScope 10.9 108,058,320
|||||| | |+ LIB <<mscorlib!Func>> 10.9 108,058,320
|||||| | | + Microsoft.AspNet.Identity.Owin!Owin.AppBuilderExtensions+<>c__DisplayClass1 10.9 108,058,320
|||||| | | |+ LIB <<mscorlib!Func,Microsoft.Owin.IOwinContext,Fourstarzz.Shared.FourstarzzIdentity.FourstarzzUserManager>>> 10.9 108,058,320
|||||| | | ||+ Microsoft.AspNet.Identity.Owin!Microsoft.AspNet.Identity.Owin.IdentityFactoryProvider 10.9 108,058,320
|||||| | | || + Microsoft.AspNet.Identity.Owin!Microsoft.AspNet.Identity.Owin.IdentityFactoryOptions 10.9 108,058,320
|||||| | | || + Microsoft.AspNet.Identity.Owin!Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware> 10.9 108,058,320
|||||| | | || + Microsoft.AspNet.Identity.Owin!Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware> 10.9 108,058,320
|||||| | | || + Microsoft.Owin!Microsoft.Owin.Infrastructure.OwinMiddlewareTransition 10.9 108,058,320
|||||| | | || + LIB <<Microsoft.Owin.Host.SystemWeb!Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineBlueprint>> 10.9 108,058,320
|||||| | | || + [static var Microsoft.Owin.Host.SystemWeb.OwinHttpModule._blueprint] 10.9 108,058,320
|||||| | | || + [static vars] 10.9 108,058,320这里有一些事情要做得更深入。首先,将您的web应用程序从x86更改为应用程序设置刀片上的x64,这至少会给您更多的喘息空间。在重新启动应用程序时,从诊断中收集一个内存转储,并解决刀片的问题以获得基线。然后将AutoHeal配置为在内存达到较高阈值时收集转储文件,以绕过您正在运行的OOM。此外,Perfview将允许您比较转储堆,以便查看分配中正在增长的对象;请在Perfview中查看启动Analysis以获得更多信息。
根据我个人的经验,如果配置不当,AutoMapper可能会导致性能问题。我曾经在没有必要的情况下,每次处理数据时都会创建一个Mapper。它还看起来像是向AutoFac IoC容器中添加了一个Mapper,并且映射程序引用了一个EventHandler。事件处理程序可以将对象引脚到堆中,从而防止GC收集对象。
https://stackoverflow.com/questions/64228792
复制相似问题