我写在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个分配实例之间未使用的。 “孔”出现当堆没有完全压实,由于在垃圾收集器固定实例或优化。
我想知道的是:
- “洞”什么样的分配2个实例之间出现?
- 什么样的实例都寄托?
- 如何压缩堆?
我希望有人能解释一下。