我试图在库伯内特斯托管的.NET 5.0WebAPI应用程序中查找内存泄漏。我阅读了一些技巧和技巧,并在这里找到了一个好建议:https://www.tessferrandez.com/blog/2005/11/25/dumpheap-stat-explained.html
一个很好的技巧--如果你想知道你的漏洞在哪里,并且不想看很多垃圾收集的数据--运行一个压力测试,然后通过调用GC.Collect(3)来诱导一个GC,取一个内存转储,然后对它进行更多的压力,再次诱导一个GC,再进行另一个内存转储,比较堆上的对象。
我真的不想为这个应用程序创建一个特殊的调试方法,并将它重新部署到测试环境中。那么,我能从应用程序外部触发第2代的垃圾收集吗?
发布于 2022-02-17 08:00:36
您需要分析导致内存泄漏的原因。DotMemory是一个很好的分析快照的工具,您可以分析分配之间的差异并找到根本原因。
最好的做法是,在大多数情况下,不强制进行垃圾收集。CLR足够聪明,可以在适当的时候为您清理内存。
但是,如果您有必要强制GC,您可以这样做:
在API控制器中,实现ApiController的Dispose方法,并将这一行添加到其中。
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);每次请求被服务并且控制器即将被释放时,这都会导致GC收集,这可能会影响性能。
B.您可以创建类似于api/optimize的API端点,并实现它以强制GC集合。
发布于 2022-02-17 07:42:17
您可能希望使用内存调试器。我使用的方法既可以触发GC,也可以捕获内存的快照,并以便于查找泄漏的方式显示结果。
您可能会自己编写一些小工具来触发GC,但是如果您得到了时间的报酬,那么只购买有助于解决问题的适当工具可能更符合成本效益。这里是一个post about different profilers,但与公认的答案相反,至少在2022年,我会说dotMemory工作得非常好。
https://stackoverflow.com/questions/71153541
复制相似问题