原创
FixMemoryLeak – 七日杀服务器内存泄漏修复
这个 Mod 解决什么问题?
服务器长时间运行后内存持续增长,最终导致卡顿甚至崩溃。根源是游戏代码中 HashSetLong 数据结构存在设计缺陷:
-
内部数组只增不减 — 玩家探索新区域时,HashSetLong
内部数组扩容;离开后元素被移除,但数组大小永远不收缩 -
TrimExcess()方法是反向 Bug — 原版代码调用TrimExcess()
不仅不收缩内存,反而会让数组大小翻倍
// 原版代码 (有 Bug) public void TrimExcess()
{ Resize(); // Resize() 内部是 table.Length <<
1,翻倍!
}
修复了什么?
| 修复项 | 说明 |
| HashSetLong.TrimExcess() | 修复为真正收缩内部数组,重新哈希活跃条目到更小的数组中 |
| 定期自动回收 | 按配置间隔自动对所有 HashSetLong 实例执行收缩,无需手动干预 |
| 手动回收命令 | 控制台输入 fixmemory 立即执行一次清理 |
回收的是什么内存?
以一个玩家的 chunksLoaded 为例:
| 数组 | 元素大小 | 收缩前 | 收缩后 | 节省 |
| table[] (哈希桶) | 4 bytes | 1237 个 | 109 个 | 4.4 KB |
| links[] (链表节点) | 8 bytes | 1237 个 | 109 个 | 8.9 KB |
| slots[] (存储值) | 8 bytes | 1237 个 | 109 个 | 8.9 KB |
| 合计 | 24.2 KB | 2.1 KB | 22.1 KB / 实例 |
服务器中 HashSetLong 实例数量(8 人在线):
-
ChunkObserver 相关:每玩家约 34 个实例 × 8 人 = 272 个
-
WorldChunkCache / ChunkCluster:大型实例,峰值可达数千甚至上万大小
-
PrefabInstance.occupiedChunks:每个预制件 1 个
配置文件
配置文件位于:Mods/FixMemoryLeak/Config.xml,修改后重启服务器生效。
<EnableAutoCleanup>true</EnableAutoCleanup> <CleanupIntervalMinutes>30</CleanupIntervalMinutes>
使用方式
-
将
FixMemoryLeak
文件夹放入服务器Mods
目录 -
重启服务器
-
日志中看到
[FixMemoryLeak]表示加载成功
Loaded. -
定期清理会自动运行,也可在控制台输入
fixmemory手动触发
日志示例
[FixMemoryLeak] Loaded. AutoCleanup=True, Interval=30min [FixMemoryLeak] Config loaded: EnableAutoCleanup=True, Interval=30min ...30分钟后... [FixMemoryLeak] Observer.chunksLoaded: 1237 -> 109 (count=52) [FixMemoryLeak] Observer.chunksAround[3]: 251 -> 37 (count=12) [FixMemoryLeak] Auto cleanup done. Trimmed 5 collections.
兼容性
-
纯服务端 Mod,客户端无需安装
-
通过 Harmony 补丁运行,不修改游戏文件
隐藏内容需要付费才可以看见








鄂公网安备42011202002543号



