java– 频繁的Integer.toString()转换的内存问题

java– 频繁的Integer.toString()转换的内存问题,第1张

概述我目前正在将用C#(用于WindowsPhone)开发的游戏移植到Java(Android).我们在Java版本中遇到内存问题,在分析之后,它似乎来自内存中的大量String对象,显然是由于String的不可变特性.现在,我已经设法将其追溯到将玩家的得分呈现给屏幕的方法,其中每次得分改变时使用Integer.toString

我目前正在将用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.

总结

以上是内存溢出为你收集整理的java – 频繁的Integer.toString()转换的内存问题全部内容,希望文章能够帮你解决java – 频繁的Integer.toString()转换的内存问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1117770.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存