Dimension Leak Fix

Dimension Leak Fix

修复切换维度时的内存泄漏问题。像Collective、AmbientSounds和Create这类模组会在RAM中保留旧世界,本模组会自动清理它们,每次切换可回收2-4GB内存。

杂项

每次你在主世界、下界和末地之间传送时,你的客户端都会创建一个新的ClientWorld。旧世界应该被垃圾回收,但几个流行的模组意外地持有对它的引用——导致它永远留在内存中。

仅仅几次维度切换后,这就能消耗 4-8 GB 的内存,导致卡顿、掉帧,最终崩溃。

维度泄漏修复 自动检测维度转换,并精准地切断这些保留链,每次转换可回收 2-4 GB 的内存。

它修复了什么

来源 问题 影响
实体引用 旧世界中的实体持有一个指向它的.level字段 每次转换约 200 MB
Collective BlockEntityData.cachedBlockEntities 通过嵌套的 WeakHashMaps 保留了旧世界 每次转换约 1.2 GB
AmbientSounds AirPocketScanner 线程将数千个 ChunkSections 作为 GC 根持有 每次转换约 1.4 GB
Create 渲染器缓存持有对旧世界数据的引用 不定
区块存储 旧世界的 ChunkManager 保留了所有已加载的区块在内存中 每次转换约 1-3 GB

工作原理

该模组采用两阶段方法:

  • 阶段 A(即时):当你改变维度时,模组立即解除实体引用,刷新 Collective 缓存,停止 AmbientSounds 扫描线程,解除 Spark 命令发送者,并使 Create 的渲染器失效。
  • 阶段 B(3 秒后):模组清除旧世界的区块存储数组和实体集合。这是延迟的,以避免在转换期间干扰渲染器。

兼容性

  • 仅客户端——不需要在服务器上安装
  • 无论是否安装了上述任何模组都能工作——模组检测已安装的内容并仅应用相关修复
  • 已使用 200+ 模组测试,包括 Iris、Sodium、Distant Horizons、Create、Collective、AmbientSounds

日志输出

模组记录它所做的所有事情。维度改变后的示例输出:

[DimensionLeakFix] 检测到维度改变,正在清理旧世界...
[DimensionLeakFix]   实体:已解除 131 个世界引用
[DimensionLeakFix]   Collective:已刷新 cachedBlockEntities 中的 1 个缓存
[DimensionLeakFix]   AmbientSounds:扫描器已停止(已清除 3 个字段)
[DimensionLeakFix]   Create:渲染器缓存已失效
[DimensionLeakFix] 阶段 A 完成(137 次操作)
[DimensionLeakFix] 阶段 B 已计划(延迟 3 秒)
[DimensionLeakFix] 阶段 B:正在释放旧世界数据...
[DimensionLeakFix]   区块:已释放 2809 个槽位
[DimensionLeakFix]   loadedChunks:已清除 2809 个条目
[DimensionLeakFix] 阶段 B 完成(已释放 2810 个引用,释放约 3706 MB)

用于 Legends Reborn: Medieval 整合包中。