.net - 尽管所有堆中都有常量字节,有什么方法可以限制 Gen 0、1 和 2 的垃圾收集?这是内存泄漏的迹象吗?

标签 .net memory-leaks

我试图在我们的软件中查找内存泄漏,在这样做时我发现,在 Windows 中内置的“性能监视器”报告中 -

  1. 第一代和第二代的垃圾收集量呈指数级增长,而 进程正在做一些工作
  2. 当进程空闲时,Gen 1 和 Gen 2 的垃圾收集保持不变
  3. 随着时间的推移,无论进程是否正在执行某些工作,第 0 代的垃圾收集都会持续增加
  4. 所有堆中的字节数表明它不会随着时间的推移而增加

这正常吗?

这是绩效报告的屏幕截图 Performance Monitor report

最佳答案

这些图表显示了从跟踪开始的垃圾收集总数,它不是提升的频率。图表还以不同的比例显示 - 查看 PerfMon 的“比例”列。如果您注意到 GC 花费太多时间,请使用适当的工具并检查它。例如JetBrains dotTrace (在时间轴模式下)将显示您的应用花费了多少时间用于 GC。

您还可以使用“% Time in GC”性能计数器来实现此目的。 “显示自上次垃圾收集周期以来执行垃圾收集所花费的时间百分比。此计数器通常指示垃圾收集器代表应用程序收集和压缩内存所完成的工作。该计数器仅在每次垃圾收集结束时更新。该计数器不是平均值;其值反射(reflect)了最后观察到的值。” msdn.microsoft.com/en-us/library/x2tyfybc(v=vs.110).aspx

关于.net - 尽管所有堆中都有常量字节,有什么方法可以限制 Gen 0、1 和 2 的垃圾收集?这是内存泄漏的迹象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968052/

相关文章:

.net - 如果不是路径验证,File.Exists 的目的是什么?

c# - 优化 MVC Controller 中的 C# 代码

Java:多线程邮件应用程序泄漏内存

c - 内存使用不足会导致内存泄漏吗?

c++ - 在 malloc_error_break 中设置断点以在 C++ 中进行调试

java - Spring boot Controller 中的 `new` 是不好的做法吗?

.net - Regex.Matches 匹配大写和小写

c# - 我如何让它显示文件大小,点(点)后只有两位数?

.net - 如何实现分布式信号量?

winforms - 检测 Winforms 中的 gdi/用户处理程序泄漏