Emi*_*nin 13 java android memory-leaks memory-management
这个问题与Android中的内存有关.
我的方法:
我有两个活动,A和B.从A,我这样启动B:
Intent i = new Intent(A.this, B.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
在按钮上单击B,我这样做:
B.this.finish();
Run Code Online (Sandbox Code Playgroud)
结果:
当我在活动A中时,堆内存为7.44 MB.然后,当我启动B并在B上调用完成(从而返回到A)时,堆增加了0.16 MB.再次重复此过程,堆每次增加0.08 MB.
附加信息:
- 我使用MAT来分析内存分配并试图找到这个漏洞.奇怪的是,活动B似乎有5个实例.碰巧的是,我重复了startActivity/finish过程5次.底部条目是活动,其他条目是活动中的监听器:

这是统治者树的截图.我找不到任何异常或怀疑的东西.

- 我已经观看了关于内存使用(和泄漏)的谷歌IO视频.
题:
无论我做什么,是否有可能始终分配这个0.08 MB的堆(并且不能由GC收集)?如果没有,任何可能导致这种情况的想法?
更新:
我试图在没有在B中设置内容视图的情况下启动活动B.这意味着B是一个完全空的活动.结果是当我多次重新启动活动时堆内存没有增加.但请注意,这不是解决方案.我必须能够设置内容视图.
scorpiodawg:我尝试在模拟器上运行我的应用程序,堆仍在增长.不错的尝试.
ntc:我把所有出现的"this"更改为"getApplicationContext()"尽可能的地方.我无法调用setContentView(getApplicationContext()); 因为setContentView需要对布局文件的引用,而不是上下文.我做的是创建一个空的布局文件并调用setContentView(emptylayout); 在活动B的onDestroy方法中.这没有帮助.
我试图删除所有代码,以便只调用setContentView(mylayout).问题持续存在.然后我删除了布局XML文件中的所有gui元素.问题持续存在.唯一剩下的就是容器视图,几个嵌套的线性,相对和滚动布局.我试图删除滚动条中的"android:scrollbarDefaultDelayBeforeFade"属性.结果很好,内存泄漏消失了.然后我放回了我之前删除的所有代码但没有设置"android:scrollbarDefaultDelayBeforeFade"属性并且内存泄漏又回来了.这有多奇怪?
Nic*_*ckT 11
如果您有5个活动B实例,那么您没有正确管理活动堆栈.我发现检查它的最佳方法是使用CLI命令:
adb shell dumpsys meminfo'你的应用包名'
当我在它们之间切换时,我在两个活动项目中遇到了类似的问题.每次我切换时,我都会在堆栈上看到一个新实例,如上面的命令所示.然后,我将已启动活动的标志设置为FLAG_ACTIVITY_REORDER_TO_FRONT,代码如下:
Intent i = new Intent("com.you.yourActivityB");
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
一旦我完成了这个,那么当我在它们之间切换时,adb shell命令没有显示我的两个活动的更多实例
| 归档时间: |
|
| 查看次数: |
5292 次 |
| 最近记录: |