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

时间:2008-11-27 18:09:39

标签: performance java-me garbage-collection

我想知道是否有可能调整垃圾收集器在JavaMe上的工作方式,以便以某种方式提高性能(可能会减少段落数量)?我看过一些关于它的文章,但主要是针对Java SE,其中大多数人都说GC高度依赖于制造商。那将是多少。

3 个答案:

答案 0 :(得分:3)

当垃圾收集器被触发时,除非您掌握了运行应用程序的特定VM的实施方式,以及为您使用的特定电话配置和定制的具体方式,否则很大程度上是一种谜。

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

我发现在相同的线程中连续3次调用System.gc()但是从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 )...

...

答案 1 :(得分:1)

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

如果您遇到垃圾收集引起的暂停问题,您必须做两件事:

  • 通过重用对象减少程序产生的垃圾,避免代码串联等代价高昂的事情(改为使用StringBuffer)
  • 当一点冻结无关紧要时(例如,在游戏的“加载”屏幕期间),使用System.gc()强制进行垃圾收集,以减少收集器进程在烦人时触发的几率。

答案 2 :(得分:0)

感谢所有输入人员。我已经看到不可能为支持Java Me的设备调整GC。至少不是以任何简单或有用的方式。无论如何我都会打开这个问题,以防这种情况在某种程度上发生变化。 :)