这个简单的 Android Application 项目示例(在 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(简而言之,代码与 1 相同,除了 UNCOMMENTED Log.... 行。所以 WITH 调用 printObjet):
...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
Log.v(TAG, ">>> ACTIVITY [onRestoreInstanceState] config:"+printObject(savedInstanceState));
super.onRestoreInstanceState(savedInstanceState);
}
这是 Eclipse Memory Analyzer 在 62 次(每种情况下)旋转平板设备导致 Activity 重新启动后分别针对 Sample 1 和 2 的快照:
第二张图像的绿色区域为“泄漏嫌疑人”:
问题嫌疑人3
由“dalvik.system.PathClassLoader @ 0x416beb30”加载的 62 个“com.example.leaktest.MainActivity”实例占用 1,959,008 (24.72%) 个字节。
用于测试:Eclipse 4.2 / Gson 2.2.2 (and 2.1) / Android 4.2 / Android Tablet with 4.1.1
问题:这是一个问题(在 Android 或 Gson 中)吗?或者我错过了课程:)?