【发布时间】:2014-07-25 10:15:41
【问题描述】:
我在一本大学书籍中遇到了一个令人困惑的问题: 那里说“堆不是静态的,可以通过向操作系统请求更多内存来按需增长”。
所以我感到困惑的是:假设我运行我的应用程序,并且对象是在堆上分配的。在某些时候,应用程序内存不足:现在会发生什么?
据我了解,Gc(垃圾收集器)启动并开始它的标记和清除操作。我想知道堆是否有可能以某种方式从 CLR 调用 Gc,而不是从操作系统请求更多内存?
我在 C++ 语言中读到过,有一种方法可以实现,但在 C# .Net Framework 4.5 中是否可行?
【问题讨论】:
-
如果它需要,CLR 会请求更多内存——它只会尝试首先进行垃圾收集(通常,无论如何)。你到底想达到什么目的?
-
我只是想理解这句话。堆何时会请求更多内存?堆被分为 Gen 0,1,2。当 Gen 2 中的内存被填满时,是否会发生 Gen 2 中的垃圾回收?或者此时堆可以通过向操作系统请求更多内存来增长?
-
术语“GC 堆”是一个方便的抽象,但它与您在教科书中找到的那种堆不太相似。它不分配内存,它分配地址空间。 Windows 上的低级操作系统调用是 VirtualAlloc()。只有当垃圾收集没有释放足够的地址空间并且周围没有备用段时才会发生这种情况。又不急着释放地址空间。内存不足实际上意味着可用地址空间不足。这通常发生在没有足够大的孔时。
标签: c# .net memory-management garbage-collection heap-memory