Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 频繁整数.toString()转换的内存问题_Java_Android_String_Performance - Fatal编程技术网

Java 频繁整数.toString()转换的内存问题

Java 频繁整数.toString()转换的内存问题,java,android,string,performance,Java,Android,String,Performance,我目前正在将一款用C#(适用于Windows Phone)开发的游戏移植到Java(Android)上 Java版本中存在内存问题,在分析之后,它似乎来自内存中大量的String对象,这显然是由于String的不可变性质。现在,我已经设法找到了将玩家的分数呈现到屏幕上的方法,每次分数发生变化时(每秒多次)都会使用Integer.toString()。我不能真正使用StringBuilder(这是我们在C版本中使用的),因为我们使用的框架的文本呈现方法只接受String作为参数,因此无论如何都会发

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

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

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

更新:

游戏节奏非常快,分数部分取决于自当前“阶段”开始以来经过的时间。每秒更新15次

我们没有保留对字符串的引用,但我想可能框架正在泄漏或复制这些字符串,所以我正在尝试研究这一点(它不是一个公共框架,据我所知,它还没有用于这种快节奏的游戏)


池是一个很好的建议,我想尝试一下,但评分系统必须进行修改,才能有一组固定的值。

我不确定它在您的特定情况下是否有用,但一般来说,当您使用一些固定的字符串值时,将它们全部添加到字符串池是有意义的。在这种情况下,您可以强制JVM不要为每个新字符串在堆上创建对象,而是使用字符串池

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

return String.valueOf(123).intern();
javadoc中的一些补充说明:

调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用


我们最终解决了这个问题,创建了我们自己的可修改字符串类,该类由一个固定长度的字符数组支持,并编写了我们自己的文本呈现方法,初始化后使用零分配


在这之后,一切运行得更加顺利,但我们仍然有一些由GC引起的“冻结”。在分析之后,发现这是由于在主游戏循环期间在循环中创建了大量迭代器。然后我们编写了一个自定义数组类,它使用了一个迭代器池,现在一切都运行得很好

您多久更新一次屏幕上的分数?您确定整数.toString()是问题所在吗?通常不会对性能产生影响,除非你一次做100次/显示多个分数。如果内存中有大量字符串对象,而您只需要一个或两个,这意味着应用程序正在泄漏字符串,垃圾收集器无法收集它们。检查探查器中哪些对象引用了字符串,这可能会给您一个线索。可能是内存泄漏导致了对这些字符串的引用。这是一个很好的建议,但如果分数每次都更改为新值,则可能不适用于这种情况。@iTech您是对的。从这个问题上看,不太清楚分数集是固定的还是不固定的,坦率地说,没有一些分析信息,很难说问题是什么。