【发布时间】:2018-10-22 16:51:39
【问题描述】:
阅读Tess Ferrandez' Blog关于垃圾收集的内容,她说垃圾收集有 3 个可能的原因:
- 当您分配一个新对象并达到第 0 代预算时,即如果新对象会导致它超出预算。
- 当有人调用 GC.Collect(诱导 GC)时
- 基于内存压力
我理解第 1 点和第 2 点,但第 3 点中的内存压力是什么意思?
我以为这是系统中可用的一般内存,但如果系统真的用尽了所有内存,那么我想整个系统都会蓝屏。
内存压力究竟是什么意思?这与超出一代人的预算有何不同?
【问题讨论】:
-
像苔丝这样的人可以访问微软的源代码,所以当他们说一些你不完全理解的东西时,很有可能只有通过代码阅读问题才能得到解答。 github.com/dotnet/coreclr/tree/master/Documentation .NET Core 现已开源,部分 Microsoft 内部资料已发布,您可能会自己得到答案。
-
查找地址空间、物理内存和虚拟内存的区别。您不会崩溃(通常),因为物理内存由虚拟支持/超出 - 但是,这很慢。在这种情况下,“内存压力”当然是指物理内存或地址空间接近耗尽。
-
还有另外一种机制,目前还没有发现它是如何工作的。自己试试容易,写个循环,分配一个byte[85000]数组。它们来自大型对象堆,通常仅由 gen#2 集合收集。但工作正常,没有任何问题。我假设 Tess 正在谈论 GC.AddMemoryPressure()。
-
@HansPassant 我之前做过这个实验,它确实会在一段时间后抛出
OutOfMemoryException。 -
@HansPassant 我认为
GC.AddMemoryPressure和GC.RemoveMemoryPressure会记录正在使用的非托管内存,以便GC 在计算预算使用时将其考虑在内。
标签: .net windows memory-management garbage-collection clr