在Java ME中是否可以更改垃圾收集行为?

3

我想知道是否有可能调整JavaMe垃圾收集器的工作方式,以某种方式改善性能(例如减少通道数)? 我看过一些相关文章,但大多是针对Java SE并且大多数文章都说GC高度依赖制造商。这会有多大影响。

3个回答

3
垃圾收集器何时触发往往是个谜,除非你对应用程序所运行的特定VM实现方式以及如何配置和为你使用的特定手机进行定制有第一手的了解。
调用java.lang.System.gc()不能保证垃圾收集器被触发。通常,它只是增加了VM很快启动垃圾回收的概率。
我发现,在同一个线程中连续调用System.gc() 3次,但从3个不同的方法中调用,往往效果还不错。
有许多方法可以解决JavaME标准API实现中的低效问题,以减少产生的垃圾量:
- 扩展ByteArrayOutputStream,这样当您想要访问数据时就不需要创建字节数组的副本。 - 避免调用StringBuffer.getChars()和StringBuffer.toString()。改为使用StringBuffer偏移量和长度来编写代码。 - 将本地缓冲区(byte[]、StringBuffer等)转换为实例或静态变量(并用synchronized保护它们)。显然,这样做会带来一些开销,但它可以防止由于过于频繁的垃圾回收而导致应用程序冻结。 - 扩展StringBuffer,避免在String和StringBuffer之间来回切换:实现append(String, offset, length)、parseInt(int)、indexOf(String, index)、replace(offset, StringBuffer, offset, length)等方法。
...

实际上,Java ME没有StringBuffer,因为它基于较旧版本的Java SE(我认为是1.4或更低版本)。 - Decio Lira
Java ME确实有一个StringBuffer类。它在java.lang包中。 - Fostah
抱歉,我想说的是 StringBuilder :) - Decio Lira

1

我没有看到任何可能调整J2ME垃圾回收行为的方法。

如果您遇到由垃圾回收引起的暂停问题,您需要做两件事:

  • 通过重复使用对象并避免昂贵的操作(使用StringBuffer代替),减少程序产生的垃圾
  • 在不影响程序运行的情况下(例如,在游戏的“加载”屏幕期间),使用System.gc()强制进行垃圾回收,以降低触发垃圾回收器进程的概率。

我可能错了,但它在JSR 30(CLDC)http://java.sun.com/javame/reference/apis/jsr030/和JSR 218(CDC)http://java.sun.com/javame/reference/apis/jsr218/中有定义。并且它被定义为Runtime.getRuntime().gc()的等效物。但也许我们不是在谈论同一件事... - Cyrille Ka
1
是的,在J2ME中肯定有System.gc()。这个问题出了些明显错误的评论。 - Fostah

0

感谢大家的所有意见。我已经看到在Java Me兼容设备上调整GC是不可能的。至少没有任何简单或有用的方法。无论如何,我仍然会保持这个问题的开放状态,以防这种情况在未来发生变化。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接