我用 C# 编写了一个长 TCP 连接套接字服务器。我的服务器中的内存出现峰值。我使用 dotNet Memory Profiler(一种工具)来检测内存泄漏的位置。Memory Profiler 显示私有堆很大,内存如下图(数字不是真实的,我想展示的是 GC0 和 GC2 的 Holes 非常非常大,数据大小正常):
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
但是,什么是 GC 漏洞?dotNet Memory Profiler 的文档确定了“漏洞”:
“空洞”表示两个分配的实例之间未使用的内存。由于固定实例或垃圾收集器中的优化,当堆未完全压缩时会出现“空洞”。
我想知道的是:
- “洞”出现在哪两种分配的实例之间?
- 固定什么样的实例?
- 如何压缩堆?
我希望有人能解释一下。