1

この Android アプリケーション プロジェクトの簡単な例 (Eclipse 内)。コード サンプルとメモリ スナップショットの写真の違いを見てください。com.google.gson.Gson.toJson を呼び出すとメモリ リークが発生するようです。サンプル 1 (printObject を呼び出す行はコメント化されています):

public class MainActivity extends Activity
{
...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    // Log.v(TAG, ">>> ACTIVITY  [onRestoreInstanceState] config:"+printObject(savedInstanceState));
    super.onRestoreInstanceState(savedInstanceState);
}
public String printObject(Object object)
{
    try  { return new Gson().toJson(object); }
    catch (Throwable ex){return "[FAILED to PRINT Object] : "+ex.getMessage();}
}
}

サンプル 2 (要するに、UNCOMMENTED Log.... 行を除いて 1 と同じコード。したがって、printObjet への WITH 呼び出し):

...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    Log.v(TAG, ">>> ACTIVITY  [onRestoreInstanceState] config:"+printObject(savedInstanceState));
    super.onRestoreInstanceState(savedInstanceState);
}

そして、これは、サンプル 1 と 2 の Eclipse メモリ アナライザーのスナップショットで、タブレット デバイスを 62 回 (それぞれのケースで) 回転させてアクティビティを再起動させた後のものです。

サンプル 1 の場合:

サンプル 2 の場合:

2 番目の画像の緑色の領域の「漏れの疑い」:

問題の容疑者 3

「dalvik.system.PathClassLoader @ 0x416beb30」によってロードされた「com.example.leaktest.MainActivity」の 62 インスタンスは、1,959,008 (24.72%) バイトを占有します。

テストで使用: Eclipse 4.2 / Gson 2.2.2 (および 2.1) / Android 4.2 / Android Tablet with 4.1.1

ネットからいくつかの同様の問題があります: ここおよび ここ

質問: これは問題ですか (Android または Gson で)? または私はレッスンを逃した:) ?

4

1 に答える 1

0

あなたの問題は62 instances of "com.example.leaktest.MainActivity"、Gsonとは無関係です。Android デベロッパー ブログのこの投稿など、アクティビティ リークを回避するための情報がたくさんあります。

于 2013-03-30T16:37:32.880 に答える