java - 为什么空 libGDX-App 的 RAM 使用率稳步攀升?

标签 java memory-leaks libgdx garbage-collection

大师们,

我是 libGDX(和一般的 Java 编程)的新手,并且有一个关于 libGDX 应用程序的 RAM 使用的问题,我无法在网上找到答案。 几天前,当我从我目前阅读的“使用 LibGDX 进行 Java 游戏开发”一书中定制游戏示例时,我注意到该游戏的 RAM 使用率在单独放置约 1 小时后激增。我的 Linux 资源监视器从 ~120MB 开始,到我关闭它时增加到 1300MB。我已经就此事联系了作者,因为我逐行阅读了他的书,但仍然有这种行为!

除了他的示例中可能存在的漏洞外,我决定更深入地挖掘并使用最新的 gdx-setup.jar(v.1.9.9)创建一个空的 LibGDX-App,并决定让它运行一段时间。 我使用 Ryzen 2700X、32GB RAM 和 Linux Mint 19.1 在我的工作站上对此进行了测试。 有趣的是,当我关闭时,空的应用程序显示出类似但不那么剧烈的行为,RAM 使用率随着时间的推移从 ~50MB 继续攀升到 ~260MB,甚至没有一次下降! 我在网上读到资源监视器实际上不显示 java 进程中正在运行的游戏消耗了什么,而是混合了一些 JVM 的东西。所以我决定借助 jConsole 和 VisualVW 进一步分析。我怀疑是惰性 GC,但两种工具都显示 GC 定期运行。尽管如此,我的操作系统的资源监视器显示空的 LibGdx-App 中的 RAM 使用率不断攀升,尽管它除了用红色背景上令人讨厌的 Bad Logic-Smiley 盯着我看之外什么也没做 ;-)。

我已经在论坛和 stackoverflow 上以 LibGDX 的内存泄漏和 RAM 消耗为主题进行了深入搜索,但找不到满意的答案。所以我想知道这种行为是否值得担心,或者这是否正常?如果是这样,甚至空应用程序的 RAM 使用率也会持续攀升,那么人们如何检测是否一切正常或应用程序是否泄漏内存? 如果你们中的一些 LibGDX 专家可以与像我这样的菜鸟分享您在这个话题上的智慧,我将不胜感激 :-)

提前致谢 - 代码艺术家

最佳答案

我不是内存管理方面的专家,也不是聪明的大师,但我只有一个简单的 libGDX 游戏。 自从 25 多年前开始实现我的第一个程序以来,我一直采用以下策略开发它:始终在低端硬件上进行测试。如果一切顺利,那么一切都很好。我的 libGDX 游戏从 2011 年开始在低端 Android 设备上运行良好,iOS 版本从 2013 年开始在 iPhone 上运行良好。在今天的中端移动设备上,Android 版本几乎从未被杀死以节省内存。尽管我每天玩我的游戏大约 10 次并且它为此进入前台,但这个过程显然没有足够的内存让 Android 决定关闭它。 Play 商店的评论者称赞该游戏在低端设备上运行流畅。

所以我的回答是:libGDX 没有问题,也许您只是观察系统上的一些 JVM 行为。编写您的游戏,在低端设备上测试它 - 使用旧的 Galaxy S3 或 Moto G,或者如果您打算只发布桌面版,请使用您的旧 2011 商务笔记本电脑进行测试。如果一切正常,请不要试图追踪或解决不存在的问题。

顺便说一下,欢迎您加入 Github 页面上链接的 libGDX discord。这是进行此类讨论的正确地点,我们有一些人在那里闲逛,他们以前确实研究过内存行为。

关于java - 为什么空 libGDX-App 的 RAM 使用率稳步攀升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956003/

相关文章:

java - 在设备的本地存储上创建 Android 保存文件?

javascript - 如果使用 Socket.IO,是否可以为 HTML 编译 LibGDX 游戏?如果是这样,怎么办?

ios - 如何在使用属性时修复此泄漏?

java - 如何查找并修复 Java 嵌套类中的内存泄漏?

Java 比较包含字符和数字的字符串

java - 从 Tomcat 7 迁移到 Tomcat 8

c - 在 C 中的循环内分配和释放内存

java - Gdx运行时异常: Asset not loaded

java - 如何从混合的 java/scala eclipse 项目创建 sbt 构建文件?

java - 是否可以将字符串与二维数组中的数组名称进行比较?