【问题标题】:What is meant by "Memory Pressure"?“内存压力”是什么意思?
【发布时间】:2018-10-22 16:51:39
【问题描述】:

阅读Tess Ferrandez' Blog关于垃圾收集的内容,她说垃圾收集有 3 个可能的原因:

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

我理解第 1 点和第 2 点,但第 3 点中的内存压力是什么意思?

我以为这是系统中可用的一般内存,但如果系统真的用尽了所有内存,那么我想整个系统都会蓝屏。

内存压力究竟是什么意思?这与超出一代人的预算有何不同?

【问题讨论】:

  • 像苔丝这样的人可以访问微软的源代码,所以当他们说一些你不完全理解的东西时,很有可能只有通过代码阅读问题才能得到解答。 github.com/dotnet/coreclr/tree/master/Documentation .NET Core 现已开源,部分 Microsoft 内部资料已发布,您可能会自己得到答案。
  • 查找地址空间、物理内存和虚拟内存的区别。您不会崩溃(通常),因为物理内存由虚拟支持/超出 - 但是,这很慢。在这种情况下,“内存压力”当然是指物理内存或地址空间接近耗尽。
  • 还有另外一种机制,目前还没有发现它是如何工作的。自己试试容易,写个循环,分配一个byte[85000]数组。它们来自大型对象堆,通常仅由 gen#2 集合收集。但工作正常,没有任何问题。我假设 Tess 正在谈论 GC.AddMemoryPressure()。
  • @HansPassant 我之前做过这个实验,它确实会在一段时间后抛出OutOfMemoryException
  • @HansPassant 我认为GC.AddMemoryPressureGC.RemoveMemoryPressure 会记录正在使用的非托管内存,以​​便GC 在计算预算使用时将其考虑在内。

标签: .net windows memory-management garbage-collection clr


【解决方案1】:

在第 3 点中,Tess 指的是 Windows 在可用内存不足的情况下发送的“内存不足通知”。应用程序可能会监听该通知——在更糟糕的事情发生之前做出某种反应(例如,保存其关键数据等等)。表现良好的应用程序甚至可能会尝试通过减少自己的内存使用来帮助操作系统。

CLR 正在侦听内存不足通知。发生这种情况时,会触发 GC,并且通常会使 GC 更具攻击性。好处是相互的,因为减少内存压力有助于系统中的所有应用程序(包括 .NET 应用程序本身)。

何时发送确切的内存不足通知并没有很好的记录。根据内部System.Runtime.Caching.PhysicalMemoryMonitor 类中的评论,这又基于来自内部 Windows 实现的 cmets,当大约 97-99% 的物理内存被占用时(取决于安装在系统)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2020-04-06
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多