c# - 内存消耗什么?
问题描述
我试图弄清楚每次迭代究竟增加了内存消耗:
ManagementObjectSearcher Win32_Process = new ManagementObjectSearcher("Select * From Win32_Process");
while (true)
{
foreach (ManagementObject PS in Win32_Process.Get()) { }
//Not using the garbage collector GC.Collect()
Thread.Sleep(1000);
}
查看已用内存的图表:
我确信自动垃圾收集器在循环后清除了内存。为什么这没有发生?如何在不使用的情况下避免内存扩展GC.Collect()
?谢谢
解决方案
确信自动垃圾收集器在循环后清除了内存。
为什么?说明书说反了。
为什么这没有发生?
因为没有必要。GC 在需要时运行,而不是在每个循环之后(不管是什么)。
如何在不使用 GC.Collect() 的情况下避免内存扩展?
你不。或者,你这样做 - 以一种在长期内留下尽可能少的垃圾的方式进行编程。
在您的特定情况下,它也有助于不要忽略这是一个 IDisposable 对象并且您不处置它。所有 COM 对象都是 IDisposable。如果不处理它,您很有可能会丢失 GC 看不到的内存,因此它不会触发 GC。
推荐阅读
- python-3.x - 使用 antlr3 和 python3
- flutter - Stream Provider 使用自定义模型类来监听 firestore 实时变化
- reactjs - 为什么道具没有设置为状态?
- c++ - 通过指针与数组引用的数组索引序列扩展
- python - 如果我只需要对角线周围的腰带,如何加快 numpy 中的矩阵乘法?
- java - 使用 Java 12 SDK 编译 Java 11 应用程序 - 我的应用程序是哪个版本的 java?
- java - 类似于 Java 中的盒装原语的自定义类型
- node.js - Nodejs 对数据库插入进行排队的最佳工具?
- java - QueryDsl distinct 查询太慢
- javascript - 当倒数计时器为 02:30 时隐藏项目