【问题标题】:Is it possible to change Garbage Collection behavior in Java ME?是否可以更改 Java ME 中的垃圾收集行为?
【发布时间】:2008-11-27 18:09:38
【问题描述】:

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

【问题讨论】:

    标签: performance java-me garbage-collection


    【解决方案1】:

    何时触发垃圾收集器在很大程度上是一个谜,除非您第一手了解运行应用程序的特定 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 )...

    ...

    【讨论】:

    • 实际上 Java ME 没有 StringBuffer,因为它基于 Java SE 的旧版本(我认为是 1.4 或更低版本)。
    • Java ME 确实有一个 StringBuffer 类。它在 java.lang 包中。
    • 对不起,我是说 StringBuilder :)
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

    感谢所有提供意见的人。我已经看到不可能为支持 Java Me 的设备调整 GC。至少不是以任何简单或有用的方式。无论如何,我都会保留这个问题,以防这种情况暂时发生变化。 :)

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 1970-01-01
      • 2011-03-05
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多