English 中文(简体)
在Java ME中更改垃圾收集行为是否可行?
原标题:
  • 时间:2008-11-27 18:09:38
  •  标签:

我想知道是否有可能调整JavaMe中垃圾回收器的工作方式,以改善性能(可能减少传递次数)?我看过一些相关文章,但它们大多是针对Java SE的,并且大多数文章都说GC高度依赖制造商。那会有多少影响呢?

最佳回答

谢谢大家的反馈。我已经发现对于支持Java Me的设备,调整GC是不可能的。至少没有任何简单或有用的方法。无论如何,我还是会保持这个问题的开放状态,以防这种情况在未来某个时候发生改变。 :)

问题回答

当垃圾收集器被触发时,除非您首先了解正在运行应用程序的特定VM是如何实现的,以及它是如何配置和定制的,以适用于您正在使用的特定手机,否则这很大程度上是一个谜。

调用java.lang.System.gc()并不保证垃圾收集器会被触发。它通常只是增加了VM很快启动垃圾收集的概率。

我发现在同一个线程中从3个不同的方法中连续调用System.gc()通常效果不错。

有许多方法可以解决JavaME标准API实现中的不足,以减少产生的垃圾量:

  • 扩展ByteArrayOutputStream,以便在访问数据时不创建字节数组的副本。

  • 避免调用StringBuffer.getChars()和StringBuffer.toString()。改用StringBuffer偏移量和长度来编写代码。

  • 把本地缓冲区(byte[], StringBufferUnfortunately, you did not provide the text that needs to be translated into Chinese. Please provide the text so I can assist you better.)转化为实例或静态变量(并用synchronized保护它们)。显然这样做有一定的开销,但它可以防止应用程序因过于频繁进行垃圾回收而冻结。

  • 扩展StringBuffer以避免在String和StringBuffer之间来回切换:实现append(String,offset,length),parseInt(int),indexOf(String,index),replace(offset,StringBuffer,offset,length)Unfortunately, you did not provide the text that needs to be translated into Chinese. Please provide the text so I can assist you better.

Unfortunately, you did not provide the text that needs to be translated into Chinese. Please provide the text so I can assist you better.

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

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

  • Reduce the garbage that your program produces, by re-using objects, and avoid costly things like string concatenations (use StringBuffer instead)
  • Use System.gc() to force garbage collection when a little freeze doesn t matter (for example, during the "loading" screen of a game), to reduce the odds that the collector process is triggered when it s annoying.




相关问题
热门标签