使用 VisualVM 导出游戏堆转储并反馈内存问题
面向玩家的内存问题反馈指南:确认 Minecraft 进程,使用 VisualVM 导出并保存 .hprof 堆转储,再附上复现步骤和日志供开发者分析。
Available in English
A complete English translation of this article is available.
适用场景
当游戏出现下图所示的内存告警,或反复进入、退出存档后内存占用持续升高时,可以按本文导出堆转储(.hprof),供开发者分析。堆转储记录了导出时 Java 堆中的对象及其引用关系。
内存占用高或出现告警,并不能单独证明存在内存泄漏。反馈时请说明出现问题前做了什么,并尽量在问题出现后、游戏仍能响应时导出;退出游戏后就无法再获取当时的堆转储。
1. 准备工作
从 VisualVM 官网下载并启动 VisualVM。
启动需要排查的整合包,尽量复现问题,例如重复进入、退出同一存档,或执行会让内存持续增长的操作。
预留足够磁盘空间:堆转储可能达到数 GB,生成临时文件与另存为文件都需要空间。
导出期间游戏可能明显停顿,请等待操作完成。
2. 选中游戏进程
在 VisualVM 左侧的 Applications → Local 中找到运行中的 Java 进程。
双击候选进程,在 Overview 中结合主类、JVM 参数中的整合包实例路径等信息确认它属于当前游戏;进程名会因启动器和启动方式不同而变化,不能只凭是否带有 Prism 字样判断。
选择实际运行 Minecraft 的进程。不要选择 VisualVM、Gradle Daemon、Gradle Wrapper 或 IntelliJ IDEA。排查独立服务器时,应选择服务器的 Java 进程。
下图仅展示进程列表的位置,截图时没有启动游戏,选中的 Gradle Daemon 不是游戏进程。
3. 导出并保存堆转储
切到目标进程的 Monitor 页面,可以看到堆内存曲线,以及右上角的 Perform GC 和 Heap Dump 按钮。下图仍以 Gradle Daemon 演示按钮位置,实际操作时请确认当前标签页属于游戏进程。
在游戏中复现问题后,回到 VisualVM 的 Monitor 页面,确认 Heap 图表正在更新。
如果开发者要求观察垃圾回收后的状态,可以先点击一次 Perform GC,等待操作完成,并在反馈中注明执行过此操作;一般采集可直接进入下一步,无需反复点击。
点击 Heap Dump,等待堆转储生成。期间游戏可能停顿,耗时与堆大小等因素有关。完成后,VisualVM 会出现一个堆转储节点并打开对应标签页。
在左侧 Applications 树中右键新生成的堆转储节点,选择 Save As...,保存为
.hprof文件。等待保存完成,在保存目录中确认文件已经生成,再退出游戏。
生成堆转储后,还需要执行 Save As。 VisualVM 官方文档说明,堆转储在显式保存前只是临时文件。详见 Browsing a Heap Dump。
4. 提交问题反馈
通过官网右上角的反馈入口,或官网提供的 GitHub 仓库 Issues 入口提交问题。.hprof 文件较大时,可先压缩为 .zip 或 .gz;如果反馈入口无法上传,使用文件分享服务上传,并在反馈中提供可下载的链接及所需的提取码。
请同时提供以下信息,方便开发者还原问题:
整合包版本、Java 版本,以及分配给游戏的最大内存。
复现步骤:进行了哪些操作、重复了多少次、多久后出现告警或明显卡顿。
导出时的状态:仍在存档中,还是已经退回主菜单;是否执行过 Perform GC。
.hprof文件或下载链接,以及本次运行的logs/latest.log;如有崩溃报告,也一并附上。
参考资料
Comments
0No comments yet.
Your comment appears under your display name.