我有一个.Net core 2.2控制台应用程序,该应用程序内部使用EF core进行数据库调用。它使用topshelf和quartz.net作为计划的服务运行。我观察到该控制台的内存使用率一直在增加,直到达到服务器RAM的90%,我不知道它是否可以继续占用比该数量更多的RAM,因为一旦达到该极限,我通常会关闭并重新启动。
我无法在这里共享代码,因为项目规模巨大,无法缩小可能导致此问题的原因。尽管我已经检查了足够的代码,但是代码中没有任何东西可以使应用程序继续保留较旧的内存/对象。
我还使用转储分析工具之一检查了转储文件,发现大约50%的内存用于字符串值(所有字符串的作用域都是快速松散的,但都是大数据),其余用于;大部分内存由EF核心使用(准确地说是更改跟踪器)。我正在为数据库行列表循环进行大型json创建,但是所有这些内容都将在某个时候被释放/收集,因为它们都是受管对象列表的一部分,并且循环很快失去了作用域。
[有人在计划的.net core 2.2应用程序中遇到过类似的问题吗?当运行几天后,似乎没有触发GC收集或没有释放内存,考虑到代码似乎可以解决内存泄漏的问题。
仔细检查所有与Quartz.net相关的内容。 Quartz.net可能会挂在您认为应该进行GC处理的引用上。
如果使用像dotMemory这样的适当的内存跟踪器,则将帮助您准确跟踪哪些对象没有被释放。