この 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 回 (それぞれのケースで) 回転させてアクティビティを再起動させた後のものです。
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 で)? または私はレッスンを逃した:) ?