android memory optimised

来源:互联网 发布:在淘宝网上怎么买东西 编辑:程序博客网 时间:2024/06/07 03:22

我们一般是怎么去评价一个app的性能呢? 
在保证功能完善的情况下(这一点,一般做过一年以上的开发都能实现),另外就是流畅度了,通俗点说,就是这个app浏览切换起来卡不卡。 
虽然现在的Android手机不断更新换代,系统运行内存也越来越大,所以可能一般的优化很难看到效果,只有在比较低端的手机上可以提现出来,但是本着我们对自己的严格要求,还是要在内存优化这方面深入了解下的。

首先,我们要明白一点,关于一个Android应用到底占多少内存的问题。(这个我有在之前的博客,图片详解系列讲到过,这里再重复一下) 
其实这跟不同的手机厂商有关,不过一般都是16的倍数,早前的是16M,32M,后来则是64M,96M,甚至100多M居多,我目前用的测试机一个APP能够分配的最大内存是196M。

我们可以调用以下方法去获取当前APP的运行内存情况:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">Runtime<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getRuntime</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.totalMemory</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>Runtime<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getRuntime</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.freeMemory</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>Runtime<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getRuntime</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.maxMemory</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

第一个是当前APP申请到的内存,这个值可能是20M,40M等等。

第二个是当前APP未被使用的内存,也就是空闲内存,举个例子,比如说当前app总共申请到的内存是50M,但是实际只使用了35M,那么当前空余的则是15M。

第三个是系统能够分配个当前APP的最大内存,比如我这个测试机是192M。

现在举个具体的例子,假设一个app开始运行后,它先向系统申请20M,此时真正占用的内存是16M,那么就有4M是空闲内存,此时如果我们执行一个比较消耗内存的操作,比如加载一张高清大图,需要6M的内存,这个时候空闲内存4<6M,那么jvm就会想系统再去申请比如说是16M,此时总共占用的内存就是36M,而空闲内存就成了14M。

那么,如果我们此时占用的内存已经到了190M,空闲内存2M,而下一个任务需要10M内存,190-2+10>192M,那么此时jvm会先调用GC线程,去扫描一下看下当前app内部是否有可回收的内存,如果回收结束后,空余内存仍然不足,那么才会报OOM;

那么要如何才能突破某个app的分配内存上限呢,可以通过新开进程实现,即在acitivity或者service里面加上process的标签,不过,值得注意的是,即使两个activity(包括四大组件)属于不同的进程,但是它们永远是运行在同一个主线程中的!


0 0