什么是GC孔? [关闭](What are GC holes? [closed])

2019-08-01 11:50发布

我写在C#长的TCP连接套接字服务器。 Spike在记忆中我的服务器发生。 我用的dotNet内存分析器(一个工具),以检测其中存储器泄漏。 内存分析器表示私有堆是巨大的,内存是类似下面(数字是不是真实的,我想表明的是GC0并GC2的孔是非常非常巨大的,数据大小是正常的):

  Managed heaps - 1,500,000KB 
          Normal heap - 1400,000KB 
              Generation #0 - 600,000KB 
                  Data - 100,000KB 
                  "Holes" - 500,000KB 
              Generation #1 - xxKB 
                  Data - 0KB 
                  "Holes" - xKB 
              Generation #2 - xxxxxxxxxxxxxKB 
                  Data - 100,000KB 
                  "Holes" - 700,000KB 
          Large heap - 131072KB 
              Large heap - 83KB 
              Overhead/unused - 130989KB 
          Overhead - 0KB

Howerver,什么是GC孔? dotNet的内存分析器的机制的文档明确的“洞”:

“孔”表示存储器是2个分配实例之间未使用的。 “孔”出现当堆没有完全压实,由于在垃圾收集器固定实例或优化。

我想知道的是:

  1. “洞”什么样的分配2个实例之间出现?
  2. 什么样的实例都寄托?
  3. 如何压缩堆?

我希望有人能解释一下。

Answer 1:

一个固定的对象是一个不允许在内存中移动。 与非托管代码,您需要在一个指针传递给一些结构在内存中时,这往往需要 - 默认情况下,垃圾收集器可以自由走动该结构,以最好地管理内存,但是如果它这样做,当你”已经给一些非托管代码一个指针结构,那么如果它的感动,非托管代码不会被指向正确的结构更多,从而导致意外的行为。

解决的办法是“针”该对象告诉它不应该将它的GC。

不能明确压缩堆时,GC所以这应该要么执行全部或部分收集(有例外的时候本身LOH ) -牵制大量的对象将很难为它成功地管理然而这个。 有关GC详见垃圾收集器基础知识和性能提示



文章来源: What are GC holes? [closed]