我正拼命寻找内存泄漏,我想知道如何读取内存堆转储:
MainActivity
有效两次?还是只是它两次在后堆栈中? 为什么我的TrackingService
被叫两次?它在启动时被激活,然后基本上被应用程序的其余部分遗忘了。
ChooseLoginRegistrationActivity
怎么了?是在后堆栈中3到5次吗? Lambda
这两个奇怪的活动是什么?在“ startActivity()”之后,ChooseLoginRegistrationActivity
总是以finish()
结尾,它甚至应该在这里弹出吗?
当我在某个活动上调用finish()
时,分配给该活动的内存会在garbage collector
的下一次迭代中释放吗?因为当我在gc
中手动调用profiler
时,没有释放内存,等待也无济于事。进入已释放的智能手机的桌面(约占应用程序内存的50%),再返回该应用程序,则不会收回内存。
有点晚,但是使用Eclipse MAT可能会有用。您可以从Android Studio Profiler创建一个堆转储,并将其转换为标准.hprof
,以便将其导入Eclipse MAT。
在Android \ Sdk \ platform-tools]中(要访问可用于转换转储的hprof-conv
工具),打开终端并键入命令
名称生成一个转换后的文件,您可以使用该文件将适当的标准堆转储导入Eclipse MAT。导入MAT后,您可以查看给定堆中的内存概览,甚至可以获取泄漏可疑事件的自定义报告,这可能使您更接近那些可怕的OOM错误的根源。hprof-conv AS-name.hprof EclipseMAT-name.hprof
这将使用给定的EclipseMAT-name
LeakCanary还可证明对发现这些讨厌的错误有用。
希望这可以帮助您和其他任何人查找内存错误。