“Memory Pressure”是什么意思?

9

阅读Tess Ferrandez' Blog关于垃圾回收的内容,她说有三种可能导致回收:

  1. 当您分配一个新对象时,且第0代预算已达到,即如果新对象会导致其超出预算。
  2. 当有人调用GC.Collect(诱导GC)
  3. 基于内存压力

我理解前两个点,但第3点中的“内存压力”是什么意思?

我原以为它是系统中可用的总内存,但如果系统真的使用了所有内存,那我想整个系统会蓝屏。

“内存压力”实际上是什么意思?与超过一代的预算有何不同?


像Tess这样的人拥有Microsoft源代码的访问权限,所以当他们说一些你不完全理解的话时,只有通过代码阅读才能回答问题。 https://github.com/dotnet/coreclr/tree/master/Documentation .NET Core现在是开源的,并发布了一些Microsoft内部资料,所以你可能可以自己得到答案。 - Lex Li
查找地址空间、物理内存和虚拟内存之间的区别。通常情况下,您不会崩溃,因为物理内存由虚拟内存支持/超出 - 然而,这是缓慢的。在此情况下,“内存压力”肯定指的是物理内存或地址空间接近耗尽。 - peterchen
还有另一种机制,我们还没有发现它的工作原理。你可以轻松尝试自己编写一个循环来分配一个byte[85000]数组。它们来自大对象堆,通常只能通过gen#2收集。但是它可以正常工作,没有出现任何问题。我猜Tess是在谈论GC.AddMemoryPressure()。 - Hans Passant
@HansPassant 我之前做过这个实验,确实会在一段时间后抛出 OutOfMemoryException 异常。 - BanksySan
@HansPassant 我认为 GC.AddMemoryPressureGC.RemoveMemoryPressure 是用来记录正在使用的非托管内存,以便 GC 在计算预算使用时将其纳入考虑。 - BanksySan
1个回答

6
在第3点中,Tess提到了Windows在可用内存耗尽时发送的“低内存通知”。应用程序可以监听该通知,以在出现更糟糕的情况之前进行某种反应(例如保存其关键数据等)。表现良好的应用程序甚至可以通过减少其自身的内存使用来帮助操作系统。
CLR正在监听低内存通知。当它发生时,GC被触发,通常会使GC更加积极。这样做的好处是相互的,因为减少内存压力有助于系统中的所有应用程序(包括.NET应用程序本身)。
何时发送低内存通知并没有记录得很清楚。根据System.Runtime.Caching.PhysicalMemoryMonitor类中的注释(该类基于Windows内部实现的注释),低内存通知在物理内存占用量达到97-99%时被触发(取决于系统安装的物理RAM数量)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接