android 内存占用分析为什么占内存高

经验2920 米
在线时间60 小时
积分 3011, 距离下一级还需 1989 积分
积分 3011, 距离下一级还需 1989 积分
机型红米Note 4G版
签到次数39
MIUI版本5.8.6
通过手机发布
这个问题我很久以前就想问了,以前用红米、红米1S,现在用红米note,为什么系统的占用率(闲时,已禁止程序自动启动,已清理内存)始终都是50%多呢?
有大神解答一下吗?
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
经验460 米
在线时间57 小时
版本V7.5.9.0.MALCNDE
积分 523, 距离下一级还需 1477 积分
积分 523, 距离下一级还需 1477 积分
机型红米手机3S/3X
签到次数17
MIUI版本V7.5.9.0.MALCNDE
通过手机发布
哈哈。 。。。。我也觉得奇怪&&??无论是多少G的内存都这样
经验3243 米
在线时间215 小时
版本5.6.12
MIUI?热爱我的热爱。
积分 4958, 距离下一级还需 42 积分
积分 4958, 距离下一级还需 42 积分
机型一加手机
签到次数20
MIUI版本5.6.12
占一半差不多啊
经验9945 米
在线时间597 小时
版本7.7.20
荣誉开发组
机型小米Note2
签到次数144
MIUI版本7.7.20
通过手机发布
MIUI五周年
MIUI五周年纪念勋章
已关注微信
已关注极客秀微信
关注新浪微博
已关注新浪微博
关注腾讯微博
已关注腾讯微博
MIUI 9纪念勋章
2017年小金鸡勋章
回复2016年度评选活动贴
APP 1000万
MIUI论坛APP注册用户突破1000万纪念勋章
MIUI 7纪念勋章
Copyright (C) 2017 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号Android cpu过高,内存泄露等 调试手段
我的图书馆
Android cpu过高,内存泄露等 调试手段
在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下。
1.logcat命令这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v time
1adb logcat -v time
2.bugreport命令这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很大的参考作用。一般我们会把bugreport导出到电脑上分析。
1adb bugreport & xxx.log
我再次强调,bugreport里面包含丰富的系统和用户信息,它是其他很多命令输出的结果的记录,非常有用。
3.dumpsys命令这个查看系统信息,用的还是比较多的.
1234567dumpsys [options]&&&&&&&&&&&&&&&meminfo 显示内存信息&&&&&&&&&&&&&&&cpuinfo 显示CPU信息&&&&&&&&&&&&&&&account 显示accounts信息&&&&&&&&&&&&&&&activity 显示所有的activities的信息&&&&&&&&&&&&&&&window 显示键盘,窗口和它们的关系&&&&&&&&&&&&&&&wifi 显示wifi信息
例如查看某个程序内存信息:
12#查看应用com.tianxia.test的内存使用情况adb shell dumpsys meminfo com.tianxia.test
效果图如下:
里面的信息很有价值,尤其对于分析内存泄露,内存溢出都有极大的作用。
4.top命令这个查看cpu信息太方便了。
1top -m 5 -t
我们看看效果图,其中按cpu大小列出5个进程列表。
com.tianxia.test的cpu过高,会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。
5.配置文件local.prop目前网上没有查到local.prop的配置使用,工作中本人只使用过如下:
1log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE
把上述文本加到/data/local.prop中,如果没有这个文件自行创建。然后重启手机,就能看到每个应用详细的查询数据库的sql语句信息,对于调试数据库,分析和优化数据库sql异常非常有用。
6.分析手机发烫下面我们来实践一个例子,手机发烫太厉害,怎么找出问题?首先我们写一个程序com.tianxia.test,死循环,核心代码如下:
12345678@Overridepublic void onCreate(Bundle savedInstanceState) {&&&&super.onCreate(savedInstanceState);&&&&setContentView(R.layout.main);&&&&while(true) {&&&&&&&&System.currentTimeMillis();&&&&}}
这个应用打开后会一直获取系统时间,因为在主线程,肯定导致应用ANR,也会一直浪费系统cpu,手机发热,我们运行它。假设我们不知道上述代码,我们来找到这个问题:(1).找到发烫的应用。使用top命令:
1top -m 5 -t
一看是com.tianxia.test占用85%的cpu,原来是这家伙在捣鬼。进程ID是644,这个后面我们有用。(2).分析发烫的应用进程在干嘛需要用到linux下的strace命令,但是android是没有集成这个命令的,android版本的下载地址:下载完成后,上传到手机中:我们adb push strace /system/bin,在模拟器上是上传到/system/bin会报out of memory错误,我们也可以上传到/data目录下,如果没有执行权限,还需要chmod 777 strace.strace命令有很多参数,直接执行strace会显示使用说明:
其中-p参数输入的就是进程号,第一步中我们找到com.tianxia.test的进程ID是644,我们看看这个应用占用这么高的cpu在干嘛?
1strace -p 644
输出如下:
它的系统调用一直是gettimeofday,一直输出这个,显然哪里一定进入死循环了,而且是获取时间的死循环,然后结合logcat和代码,定位这段代码(就是前面我们给出的那段代码了)解决这个bug。
7.采集手机的cpu运行情况.有时使用日志我们很难针对性的获取我们想要的信息,我们可能需要写一些最简单的脚步放在手机里面执行。如监控cpu占用的记录cpu_log.sh:
1234567891011# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/cpu_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------"&&$filedate && $filetop -m 5 -n 1 && $filesleep 3done
每隔3s中就会把手机的cpu的信息写到sdcard的cpu目录下的cpu_info.log文件中,方便我们后续分析。&ps:使用方法是 push到data目录下,赋予可执行权限,在shell下执行即可。
8.采集某个应用的内存数据这个实践和上面的脚本类似,只是命令不一样我另外单独列出来,因为这个有时候很有用。比如,我们要采集com.tianxia.test的内存使用情况,分析它是不是会内存泄露,脚步类似:
1234567891011# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/mem_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------"&&$filedate && $filedumpsys meminfo com.tianxia.test && $filesleep 3done
使用方法也是一样。
9.小结零零碎碎的一直没有时间整理,有常用的也有不常用的,算是一些小技巧,感觉网上这方面的分享比较少,有时和朋友们谈起这些调试方法,特别是龙哥,硬是要求我今天写出来与大家分享,只好献丑,说不定对于解决一些疑难杂症有奇效,呵呵,想到什么写什么吧,想到几个写几个,也是一个学习的记录。
TA的最新馆藏[转]&
喜欢该文的人也喜欢问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
从来不杀后台进程,因为自己信奉缓存这一套
但是也惊异于现在安卓应用的内存占用之大,比如「开机不久后内存剩下500M左右」,但我显然是会不断缓存后台应用的
故对安卓系统的内存调度原则产生了兴趣
上下文环境
国产X米手机5-3GRAM
(常用应用20几个)
1. 从来不杀后台进程(坚持「内存不用就是浪费」的道理)
已经尝试哪些方法仍然没有解决(附上相关链接)
根据自己对Linux的些许了解,自己的模糊认识如下:
有多少用多少, 最好全部用上
新进程加进来,踢掉闲置进程
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
其实内存并不能分析后台运行着多少内存,也不是手机卡不卡的主要原因,你要去比较一下iOS里的内存占用,一点都不比Android的少,何况iPhone本身内存就少。手机的功耗集中在CPU上,内存不管你用多少,都是一样的消耗。关于对后台应用的调度,Android和iOS机制都差不多,往满了塞,不够了就清后台程序腾空间。而程序有带有优先级,优先级低的会先选择被杀掉。区别在于Android和iOS对后台程序的机制不同,iOS只允许很少一部分的程序能够常驻后台,而Android则没有任何限制,任由程序侵占后台。特别是Google没有进入国内,国内的Android市场一片混乱,也没有任何一家市场去约束App的行为,所以又推动了Android应用从设计上就肆意妄为。有的App即使本身没有常驻后台的需求,也非弄点花样非要常驻后台。长此以往,手机长时间处于高负荷状态,也就导致了Android机器越用越卡。
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:为什么安卓系统越来越占内存?
为什么安卓系统越来越占内存?
汽车多维数据集
回答首先安卓的功能在不断的完善,比如说对指纹识别,基带,高分辨率,在硬件支持的基础上,软件自然比原来所占用系统资源高。当然,最重要的是第三方系统的重置所导致的软件臃肿。原生安卓7.0的安装包只有四百多兆, 开机启动后所占用的ram也不超过700兆,因此2gram的nexus5仍然能够流畅运行。反观国内系统7.0以上应该很少有1g以下的系统包了吧,开机后更是占有ram1.5g以上,而且各种后台,云服务,安全软件和不可描述软件开机自启,自然占用ram较多。这个就像Windows,以前空间小,软件设置的反而精致,因为存储空间都是寸土寸金,现在空间大,反而不会设计的那么精简,然后功能也越来越多,越来越臃肿,甚至打开一个软件就会唤醒全家桶。但是内存大,更多的软件可以常驻内存,对打开速度也是有提升的
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
汽车多维数据集
百家号 最近更新:
简介: 我是一个IT我喜欢把我所学知识分享给大家
作者最新文章为什么知乎Android内存占用如此的大? - 知乎1被浏览210分享邀请回答还没有回答}

我要回帖

更多关于 android查看内存占用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信