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 .... line。所以WITH调用printObjet):
...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
Log.v(TAG, ">>> ACTIVITY [onRestoreInstanceState] config:"+printObject(savedInstanceState));
super.onRestoreInstanceState(savedInstanceState);
}
以下是样本1和2的Eclipse Memory Analyzer快照,分别为62次(每种情况下)旋转平板电脑设备以重启Activity:
第二张图片的绿色区域“泄漏怀疑”:
问题可疑3
由“dalvik.system.PathClassLoader @ 0x416beb30”加载的62个“com.example.leaktest.MainActivity”实例占用1,959,008(24.72%)个字节。
用于测试:Eclipse 4.2 / Gson 2.2.2(和2.1)/ Android 4.2 / Android平板电脑4.1.1
问题:这是一个问题(在Android或Gson中)?或者我错过了教训:)?
答案 0 :(得分:0)
您的问题是62 instances of "com.example.leaktest.MainActivity"
,与Gson无关。有很多关于避免活动泄漏的信息,包括Android开发者博客上的this post。