我想知道是否可以调整垃圾收集器在 JavaMe 上的工作方式以以某种方式提高性能(可能会减少通道数)?我看过一些关于它的文章,但大多是针对 Java SE 的,其中大多数都说 GC 高度依赖于制造商。那会是多少。
3 回答
何时触发垃圾收集器在很大程度上是一个谜,除非您第一手了解您的应用程序在其上运行的特定 VM 是如何实现的,以及它是如何为您正在使用的特定手机配置和定制的。
调用 java.lang.System.gc() 并不能保证触发垃圾收集器。它通常只会增加 VM 很快启动垃圾收集的可能性。
我发现在同一个线程中连续调用 System.gc() 3 次但从 3 种不同的方法往往工作得相当好。
有很多方法可以解决 JavaME 标准 API 实现中的低效率问题,以减少生成的垃圾量:
扩展 ByteArrayOutputStream 以便在您想要访问数据时不创建字节数组的副本。
避免调用 StringBuffer.getChars() 和 StringBuffer.toString()。让您的代码使用 StringBuffer 偏移量和长度。
将本地缓冲区(byte [],StringBuffer ...)转换为实例或静态变量(并使用同步保护它们)。显然,这样做会产生开销,但它可以防止您的应用程序由于垃圾收集过于频繁而冻结。
扩展 StringBuffer 以避免在 String 和 StringBuffer 之间来回切换:实现 append(String, offset, length), parseInt(int), indexOf(String, index), replace(offset, StringBuffer, offset, length)...
...
我看不到任何可能的方法来调整 J2ME 中的垃圾收集行为。
如果您遇到由垃圾收集引起的暂停问题,您必须做两件事:
- 通过重用对象来减少程序产生的垃圾,并避免像字符串连接这样的代价高昂的事情(改用 StringBuffer)
- 使用 System.gc() 在一点点冻结无关紧要时强制垃圾收集(例如,在游戏的“加载”屏幕期间),以减少在烦人时触发收集器进程的几率。
感谢所有输入的人。我已经看到不可能为支持 Java Me 的设备调整 GC。至少不是以任何简单或有用的方式。无论如何,我都会保留这个问题,以防这种情况暂时发生变化。:)