我目前正在将用C#(用于Windows Phone)开发的游戏移植到Java(Android).

我们在Java版本中遇到内存问题,在分析之后,它似乎来自内存中的大量String对象,显然是由于String的不可变特性.现在,我已经设法将其追溯到将玩家的得分呈现给屏幕的方法,其中每次得分改变时使用Integer.toString()(每秒多次).我不能真正使用StringBuilder(这是我们在C#版本中所拥有的),因为我们使用的框架的文本呈现方法只接受String作为参数,因此无论如何都会发生转换.

这是Java中的常见问题吗?任何人都可以推荐一个解决方案(除了联系框架开发人员要求他们修改他们的方法!)?

更新:


游戏节奏非常快,得分部分取决于自当前“舞台”开始以来经过的时间.它每秒更新15次.

我们没有保留对字符串的引用,但我想也许框架正在泄漏或重复这些字符串所以我试图调查它(它不是一个公共框架,据我所知它还没有被使用过对于这种快节奏的游戏).

汇集是一个很好的建议,我想到了尝试,但必须修改评分系统,以便有一组固定的值.

解决方法:

我不确定它在您的特定情况下是否有帮助,但通常当您使用一些固定的字符串值时,将所有字符串值添加到字符串池中是有意义的.在这种情况下,您可以强制JVM不为每个新字符串在堆上创建对象,而是使用字符串池.

您必须更改代码以从池返回字符串,例如:

return String.valueOf(123).intern();

来自javadoc的一些额外解释:

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

标签: string, java, android, performance

相关文章推荐

添加新评论,含*的栏目为必填