MemGuard

MemGuard

通过缓存NBT字符串、监控内存使用情况并在最佳时机触发垃圾收集,减少大型整合包和服务器中的内存占用。

优化

MemGuard

为长时间运行的 Minecraft 会话提供精简的内存行为。

MemGuard 是一个轻量级实用模组,适用于 Fabric / Forge / NeoForge(Minecraft 1.21.1),专注于减少可避免的内存分配,并使内存压力更易于观察。

MemGuard 的功能

1. 复用重复的短 NBT 字符串

  • 钩子:NbtString.of(...)
  • 通过 LRU 缓存(最多 2048 条)复用重复的短值。
  • 减少较大模组包中常见 ID/标签产生的重复对象分配。

2. 记录定期堆快照

  • 从服务器 tick 上下文中采样堆使用情况。
  • 当超过配置的使用阈值时输出警告日志。
  • 旨在提供可见性和故障排查帮助,并非直接宣称性能提升。

3. 跟踪纹理图集生命周期(客户端)

  • 在图集上传完成后,MemGuard 会在调试上下文中记录堆已使用值。
  • 帮助将加载阶段与内存行为关联起来。

技术说明

  • 使用 Mixin 钩子实现针对性行为(NbtCacheMixin、ServerChunkManagerMixin / ChunkCacheMixin、TextureCacheMixin)。
  • 无原生代码,无不安全内存访问。
  • 不会使用 System.gc() 强制垃圾回收。

重要精度说明

  • MemGuard 不保证固定的 FPS/MSPT/MB 提升。
  • 实际影响取决于模组包大小、实体/世界状态、JVM 厂商/参数以及会话时长。
  • 在具有重复 NBT 模式的中大型模组包中,预期收益通常更高。

可复现的评估(推荐)

要为您的环境评估 MemGuard,请在完全相同条件下对比基线与 MemGuard:

  1. 相同的 Java 版本、JVM 参数、模组列表、世界种子和配置。
  2. 相同的运行时长(建议每次运行 30-60 分钟)。
  3. 至少 3 次基线运行 + 3 次 MemGuard 运行。
  4. 收集可比较的指标:
  • p50/p95 MSPT(通过 spark 或类似工具)
  • 来自日志的堆使用趋势
  • 分配/GC 事件数据(JFR 或类似工具)
  1. 比较分布(中位数/p95),而非单个峰值。

安装

Fabric

  1. 安装 Fabric Loader(0.16+)
  2. 安装 Fabric API
  3. 将 MemGuard jar 放入 mods/ 文件夹

Forge / NeoForge

  1. 为您的 Minecraft 版本安装匹配的加载器
  2. 将 MemGuard jar 放入 mods/ 文件夹

兼容性

  • 设计为可与常见优化模组共存。
  • 与任何基于 Mixin 的模组一样,在正式部署前请先在您的确切模组包环境中进行测试。