通读一遍苔丝·费兰德斯的博客 https://blogs.msdn.microsoft.com/tess/2008/04/17/how-does-the-gc-work-and-what-are-the-sizes-of-the-different-generations/#collections关于垃圾回收,她说垃圾回收有 3 个可能的原因:
- 当您分配新对象且达到第 0 代预算时,即新对象是否会导致其超出预算。
- 当有人调用GC.Collect(诱导GC)时
- 基于内存压力
我理解第 1 点和第 2 点,但是什么意思记忆压力在第3点?
我假设它是系统中可用的一般内存,但如果系统确实用完了所有内存,那么我会想象整个系统会蓝屏。
实际上是什么意思记忆压力?这与超出一代人的预算有何不同?
在第 3 点中,Tess 提到了 Windows 在可用内存耗尽时发送的“内存不足通知”。应用程序可能会监听该通知 - 在更糟糕的情况发生之前做出某种反应(例如,保存其关键数据等等)。表现良好的应用程序甚至可能尝试通过削减自己的内存使用量来帮助操作系统。
CLR 正在侦听内存不足通知。当发生这种情况时,GC 就会被触发,并且通常会使 GC 变得更加激进。好处是相互的,因为减少内存压力有助于系统中的所有应用程序(包括 .NET 应用程序本身)。
何时发送内存不足通知并没有很好的记录。根据内部评论System.Runtime.Caching.PhysicalMemoryMonitor https://referencesource.microsoft.com/#System.Runtime.Caching/System/Caching/PhysicalMemoryMonitor.cs,bf4483db6db4cb4f,references类,而该类又基于 Windows 内部实现的注释,当大约 97-99% 的物理内存被占用时(取决于系统中安装的物理 RAM 量),就会发出低内存通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)