1

这个简单的 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 的快照:

对于样品 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

网上也有一些类似的问题: herehere

问题:这是一个问题(在 Android 或 Gson 中)吗?或者我错过了课程:)?

4

1 回答 1

0

您的问题是62 instances of "com.example.leaktest.MainActivity",与 Gson 无关。有很多关于避免活动泄漏的信息,包括Android 开发者博客上的这篇文章

于 2013-03-30T16:37:32.880 回答