1

XML シリアル化にSimpleFrameworkを使用する Android アプリがあります。アプリは、私がテストしたすべての実際のデバイスで遅延なく正常に動作しますが、エミュレーターで実行すると、アプリを起動するたびにガベージ コレクターが約 3 分間実行されます。

これが私がこれまでに観察したことです:

  • オブジェクトを XML にシリアル化する直前にガベージ コレクションが開始される
  • これは、最初のオブジェクトがシリアル化されてネットワーク経由で送信される前にのみ発生し、後続の呼び出しでは発生しません。
  • シリアライゼーション コードは、パッケージ化され、プロジェクトに .jar ファイルとして追加される別のライブラリにあります。

LogCat からの出力は次のとおりです。

07-27 08:17:10.275: D/dalvikvm(682): GC_FOR_MALLOC freed 10179 objects / 482344 bytes in 32ms
07-27 08:17:10.435: D/dalvikvm(682): GC_FOR_MALLOC freed 13927 objects / 535968 bytes in 33ms
....... About 300 more similar entries...

現在シリアル化に使用しているコードは次のとおりです。

public String fromElement(Object request) {
    Writer writer = new StringWriter();
    try {
        serializer.write(request, writer);
        String res = writer.toString();
        Log.d(LOG_TAG, res);
        return writer.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "";
}

明らかに、コードに変更を加えてアプリを再デプロイするたびに、これには多くの時間がかかります。libaray を使用しているときに他の誰かがこれを経験しましたか? もしそうなら、(Eclipse から) アプリを起動するたびに GC が作動するのを防ぐ方法はありますか? ヒープ (現在は に設定vm.heapSize=24) を増やすと効果がありますか? それとも別の解決策がありますか?

4

2 に答える 2

1

2.6.7 にアップグレードする必要があります。注釈処理が行われるようになったため、かなり大きな変更が加えられました。Android には、かなりよく知られている注釈の問題があることがわかりました。奇妙なことに、不適切な java.lang.reflect.Method.equals(Object) 実装に関連しています。Simple 2.6.7 は、より多くの注釈処理をキャッシュしており、はるかに優れているはずです。

于 2012-11-10T13:58:23.613 に答える
0

これは暗闇でのショットですが、初期の jvm ヒープ サイズを変更してみましたか? -xms パラメータです。エミュレーターでは低すぎる可能性があるため、最初の数分間は常にサイズを変更しようとし、ガベージ コレクションが停止します。このリンクをチェックしてください: http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp

于 2012-07-27T21:21:17.563 に答える