如何解决Android studio绝地求生8g内存不够用用的问题

解决Android内存泄漏--MAT\android studio使用方法实例 - qq_的博客 - CSDN博客
解决Android内存泄漏--MAT\android studio使用方法实例
读书笔记-android进阶
android进阶-rxjava学习
作为一名android客户端开发人员,肯定会遇到过ANR或者OOM的案例, 少部分案例除了部分业务上面的代码同步或者死锁的原因导致的外,绝大多数都是因为我们缺乏良好的代码质量导致内存泄漏或者说app内存优化的经验.我想在实际上庞大的android项目里从java代码层面解决掉内存泄漏是令每一个初级android开发人员头疼的事.
是否你对测试提过来的ANR或者OOM的大篇log表示束手无策呢~ 笔者也是过来人
这里笔者就结合自身成长经历和实际操作分享一下.
造成内存泄漏的原因
一般情况,结合这一年项目的开发经验,我总结有以下多数两种情况造成的.
ps : 相信还有其他造成泄漏的因素,可自行google,这里笔者就结合自己的开发经验和体会来说了.? ▽ ` )?
bitmap,cursor等使用后没有及时释放对应资源,造成内存泄漏,尤其是自定义控件.或者项目Gif图播放的使用.(这里相信很少人会发现这个问题,相信绝大多数开发者在gif的使用上,会使用glide的那套gif播放方案.那你就Too young了,仔细看glide关于播放管理Gif的代码,你就会发现,gif在关闭时,内存并没有释放,并且在进程中占用了大量的内存,这里笔者想单独开篇来说明这个问题,这里暂时抛砖引玉暂时不详细说了吧)
异步请求的callback持有的强引用不能被回收导致内存泄漏.这里最明显的案例当属: AsyncTask了吧.只要异步回调持有context 或者 activity , 结果可想而知了吧
使用android studio排查java代码
主要是2个点 :
在项目里引用大名鼎鼎的square公司的leakcanary . github : . 但是有个缺点 : 对于Bitmap回收或app的内存管理,在leakcanary里面是体现不出来的, 他只能给你提出代码里不能不回收的强引用引用链,方便开发者追根溯源.不过这也很给力了.
其次使用dumpsys meminfo命令+android studio的memory monitor找到不能不回收的activity,在配合MAT来找到具体的不能被回收的引用链.
dumpsys meminfo {$PackageName} ;如下 :
请注意看下面的activities的堆栈 , 有3个. 明明我们现在手机上app里面的堆栈只有1个activity,怎么会有3个?这里就表面有2个activity的object被hold住了,不能及时释放.但我们现在不知道是哪个activity泄漏了,没关系,下面我们来使用android studio找出具体的activity.
使用android studio的memory monitor + Analyzer , 如下 :
生成hprof文件后,使用android studio自带的Analyzer分析出发生泄漏的activity.如下 :
观察Reference Tree,可能有人会说里面hold的对象这么多,我怎么知道是哪个对象的持有造成了不能被回收? 这里android studio自带的Analyzer相对于MAT的劣势就表现出来了,不过没关系,他帮我们分析出Leaked Activities就可以了.接下来就是配合我们的MAT找到具体的不能被回收的原因. 请记住这里泄漏的activity名称
使用MAT定位具体泄漏原因
网上有很多关于MAT的使用教程,我觉得有些是时间原因,太久远了,新手上手并不是很容易,并且如果自己没有正确使用过一次MAT找出泄漏根源,你真的很难上手.
你先要把刚刚生成的hprof文件生成标准的hprof文件,在使用mat打开它.如图 :
打开刚刚生成的标准hprof,这里请直接关注Histogram,关于打开生成的那些报表啥的,可以不用关注,对于你找出泄漏根源没什么实际上的用处.如图 :
大家可以看到Regex这个关键词了吧,没错.我们现在要干的就是把刚刚通过android studio分析出来的泄漏的activity名称作为正则表达式关键字进行搜索. 如果没有内存泄漏,按么Object这一栏应该是为0,但现在出现了1,这就表明出现了内存泄漏,强引用代码不能被回收 如图 :
好,接下来,就仅需要通过最后两步就能找出泄漏的真正根源了.
(1) 这里右键选择list objects,这里弹出来with incoming reference 和 with outgoing reference这两个,这里解释一下,incoming表面内部持有的对象,outgoing表面当前对象被哪些对象作为内部对象持有的.因此我们这里应该选择with incoming reference
(2)同样这里邮件path to GC roots,同gradle dependencies的 exclude一样,这里exclude掉weak/soft reference,最终弹出来的表格,你就会发现很难在庞大项目里面找到的,java代码深处被泄漏的代码了
最后,发现原来始作俑者是android原生的AccountManager.AmsTask.
是不是发现android源码类似AsyncTask , AccountManager.AmsTask很坑爹了. 这就是为什么Rxjava一出来,这么受欢迎,普及如此之广的原因了.对于常规的Async异步等处理,Rx的使用比我们之前的java封装好太多了,大家可以回想一下之前项目在未使用Rx的时候,是如何封装一些异步请求的, 是不是花了很大的篇幅很多的类来封装一些async基类,但如果稍不留神就会写出内存泄漏的代码?
有兴趣的童鞋可以看看16年JakeWharton关于Rxjava的演讲视频. 也很明确的指出了rx之前通常异步的处理方式存在的问题
相信通过这个案例,对于使用MAT和android studio来找出内存泄漏的代码没多大问题了.至于关于bitmap内存的问题,也是通过上述步骤找出存在不合理的bitmap以及没有被及时回收掉的自定义view控件.有兴趣的同学可以试试.
最后,在跟大家推荐两篇关于mat的分析案例吧,便于结合并且自己在实际使用时候的理解
a. 悦跑圈 :
关于app内存管理,大家有时间可以看下官方教程,我们实际项目中也是结合官方建议来做内存优化的
google official tutorial
我的热门文章17:47 提问
求救,android studio 运行 avd 后提示内存不足,程序子自动关闭,并出现如下代码?
draw: Could not use program error=0x505
按赞数排序
其他相关推荐Andriod点滴——android&studio问题集及解决办法+eclipse_神探李-_新浪博客
Andriod点滴——android&studio问题集及解决办法+eclipse
上次在给别人演示时,要想在android studio中点击run来运行一个apk,然而总是出现“run
configure”对话框。。。当时很无奈。。
今天再次遇到这样的情况。gg了可能的情况如下:
1.模拟器的system image
level与sdklevel不匹配:例如app需要的level是22,而你的sdk还是21,这样出现问题——此时需要更新该sdk;
​2.不知是什么问题——clean
project,然后再次build;
3.gradle问题,这时一般会出现提示:红色叉——这是按照提示进行update,重新生成;
4.提示:failed to find build
tools revision ***——一般是build tools的版本不够,需要升级;
5.提示:could not resolve all
dependencies for configuration**——这些dependencies
是在build.gradle文件中规定的​,这时要看是不是此依赖过于高版本;
6.提示:could find
com.android.support-v4:23.1.0——此时查看下目录:.../sdk/extras/android/m2repository/com/android/support/​​下是否有dependencies的包,若没有打开sdk
manager,在extra下选择libraries安装;
7.还不行的话,关闭studio,再次打开,会出现处理error提示方法​,按照提示安装缺少的就好。
——————————————————————————————————————
在mac下重新使用,会遇到以下问题:
启动没有问题,但是新建第一个project时,总是会提示:
“gradle project sync
completed with some errors&”​
然后点击“show in dialog”
光标会停在“testCompile 'junit:junit:4.12'“ dependence问题,
于是选择下载离线的gradle,&http://services.gradle.org/distributions这是下载地址,然后在andriod
studio中配置gradle路径,重新启动后还是原来的错误,于是果断删掉那一行,点击ok后,正常!!
&——————————————————————————————————————
java代码也在eclipse中常用,这里也整理下在eclipse中遇到的问题:
项目上有个感叹号: 问题--missing
something;解决:右键项目-build-path中看哪些miss了,再添加。​
学会eclipse的各种技巧在实际问题中很有用!!!
怎么在eclipse打开被引用的jar包​,注意使用标题下的那一个小栏!
注意学会在某个类上、某个exception上设置断点。​
————————————————7.12————————————————————
导入一个新项目特别是在新安装的系统时,通常提示找不到一些包:
解决:自己下载包并添加到项目library​中。[按照android
studio提示的解决办法——在线搜索jar包下载总是失败,那个提示的搜索包总是404not found。。。]
=============9.29========================
谷歌官方放出studio 2.2版本,更新后先用着。
先说一点:在创建vd时,若一直按照默认设置将会启动失败:
搜了下解决办法,在最后一步“verify configuration”时,“emulated
performance”选项时graphics选择“software-gles 2.0”不要用默认的automatic选项。
修改后可以启动新的模拟器了。​
​============10.13更======================
在使用studio安装app到手机时遇到了以前没出现的问题:​
“client not ready
yet”:还没解决。。。试了下搜出来的办法:有的是debug未授权,有的是manifest里面没设置activity exported
= true等都不行。。。
读者有何建议?​
当跑在模拟器上时,提示:error running app: instant run requires adb
integration to be enabled.
这时只需在toos/android/enable adb
integration就可以。​
还有一点在6.0的模拟器上,总是提示“surface: getslotfrombufferlocked: unknown
buffer***”。。搜了下这是个bug...​
​===============更12.10=============
在不同平台下进行project的切换,导入后总是提示无法resolve
前提是各个xml文件没有错误。​
搜了下可能是导入后包名的缘故,导致编译寻找路径发生变化。
解决办法:clean project,
file--​​invalidate
cache/restart
再次rebuild时会生成本项目的r文件,然后在所需的文件中导入packagename.R就可。
同样的,若出现“cannot resolve java.io.file”之类,也是clean,不过使用clean cache
and restart。​
​========更12.17==========
studio中需要下载5.0的sdk
编译platform,于是打开sdk找到版本下载,选择后install时总是提示“connection
refused”,原来是自己之前设置的代理的问题。
于是重新设置sdk tool proxy:
打开sdk manager,选择下面的preference,设置proxy为新的代理服务器。
若想要将一个使用高版本sdk的project​降低sdk版本,可采用的办法:
在build.gradle中修改编译依赖的sdk,但这时你会发现修改后报错增多,原因:
在代码中使用了高版本sdk才有的api;在apptheme中使用的是高版本sdk定义的style,这时即使更改了theme,也是有错的,因为在后面的retrieve中是从那些style的组件中获得的。​
那么这时可以更改导入的support包的版本。
​如上图中,原来用的是appcompat-v7:25,现在换为22.
=========12.20更===========
在studio中使用adb install apk到模拟器时提示:
“adb instlal failure install failed no matching abis in android
studio”​
是因为apk编译版本是arm,而模拟器用的image是x86的,有些native得不到解析而报错。
这时可以新建模拟器使用arm image[但模拟器运行在x86系统上时,启动模拟器可能会慢。]
======3.6更==============
更新了studio到2.3,加载项目编译运行时发现提示:
“Error running app: Instant Run requires 'Tools | Android
| Enable ADB integration' to be
enabled.”​
搜了下新的studio有个新特性:可以快速部署代码的更改到模拟器/手机上。
解决办法有两个:
a 关掉这个新特性:在setting中将instant run关掉;
b 在tools-&android中选择: enable adb
integration。
这样就可以了。
另外,遇到“cannot find
***”之类,一般是缺了某个包,下载安装就行。​
=================3.7更=============
使用studio来查看修改安卓源码会发现很多红色,找不到对应的类,如何配置?
/Lefter/p/4176991.html​
该链接中不错:
首先需要先配置下studio[不过我的内存足够大,这一步我跳过];
需要源码的一些配置:模块的路径等等。这一步需要编译源码[我之前编译过,但有些文件还是没有,例如这里需要的/out/host/linux-x86/framwork/idegen.jar]
所以还需要编译一下:首先source include一些文件,这样才可使用例如mmm这样的命令。执行mmm
development/tools/idegen/命令,稍等一会会提示“make completed
successfully”,然后就可以在对应得目录下发现需要的文件。
然后执行development/tools/idegen/idegen.sh:
会在源码根目录生成:android.iml和android.ipr两个文件。
这里有些建议:“AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法:”如:[不知为何写的代码保存后会被河蟹掉...也许是因为xml文件吧...这里放个截图吧...]
​然后在studio下大开生成的android.ipr​。
这样成功加载安卓源码。下一步就是关于跳转了:
需要设置正确的sdk,以及对应的language level。
如果在使用的国会曾中会难过出现跳转错误,则可以将依赖的都删掉,只加载framework目录和external目录。[暂时还没遇到...]​
​​​​
博客等级:
博客积分:0
博客访问:14,866
关注人气:0
荣誉徽章:基于Android Studio的内存泄漏检测与解决全攻略 - 腾讯WeTest
基于Android Studio的内存泄漏检测与解决全攻略
打开微信"扫一扫", 打开网页后点击屏幕右上角分享按钮
Copyright (C) 1998 - 2017 Tencent. All Rights Reserved 腾讯公司 版权所有匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 内存不够用怎么办 的文章

 

随机推荐