免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Android内存管理

Android内存管理 获取内存大小maxMemory() 返回的是java虚拟机这个进程能构从操作系统挖到的最大的内存以字节为单位如果在运行java程序的时候没有添加-Xmx参数那么就是64兆。totalMemory() 返回的是java虚拟机已经从操作系统挖过来的内存大小也就是java虚拟机这个进程当时所占用的所有内存但不一定全使用了。freeMemory() 挖过来而又没有用上的内存freeMemory()的值一般情况下很小。内存泄露和内存溢出内存溢出 (out of memory)是指程序在申请内存时没有足够的内存空间供其使用出现 out of memory比如申请了一个 integer但给它存了 long 才能存下的数那就是内存溢出。内存泄露 (memory leak)是指程序在申请内存后无法释放已申请的内存空间一次内存泄露危害可以忽略但内存泄露堆积后果很严重无论多少内存迟早会被占光。memory leak 会最终会导致 out of memory不用在意剩余内存的大小和java的垃圾回收机制类似系统进行内存调度有个阀值只有低于这个值系统才会按一个列表来关闭用户不需要的东西。这个值默认设置得很小所以会看到内存老在很少的数值徘徊。但事实上并不影响速度。相反加快了下次启动应用的速度。内存少的时候运行大型程序会慢在内存剩余不多时打开大型程序会触发系统自身的调进程调度策略这是十分消耗系统资源的操作特别是在一个程序频繁向系统申请内存的时候。有个更改内存阀值的程序可以有一定改善。但改动也可能带来一些问题取决于值的设定。在运行大型程序之前你可以手动或使用管理软件关闭一些进程释放内存可以显著的提高运行速度。android的应用在被切换到后台时它其实已经被暂停了并不会消耗cpu资源只保留了运行状态。如果想要在后台处理些东西如音乐播放它就会开启一个服务。服务可在后台持续运行所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到标签是service。至于广播什么的我就不涉及了。所以没有带服务的应用在后台是完全不耗电的。android上的应用是javaandroid上的应用是带有独立虚拟机的每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃代价就是需要更多内存。保留更多的空闲内存实际上并不一定会提升速度相反却丧失了程序启动快的这一系统特色。数据共享剪切板 ClipBoardManager只能传递文本数据以及Intent支持的数据类型。二进制数据经过base64编码后可以作为文本传输。Android应用内存检测工具Android Studio Profiler 实时监控内存分配和GC捕获堆转储分析Native内存是发现问题和获取堆转储的首选工具。LeakCanary自动化内存泄漏检测库集成到开发环境能在运行时检测并报告Activity/Fragment泄漏极大提升效率。MAT是对Profiler捕获的堆转储进行深度分析的利器也用于深度分析LeakCanary报告的问题或分析更复杂的泄漏。Perfetto / systrace 分析系统级性能包括内存压力、GC活动等。内存判定对象可回收有两种机制引用计数算法给对象中添加一个引用计数器每当有一个地方引用它时计数器值就加 1当引用失效时计数器值就减 1任何时刻计数器为 0 的对象就是不可能再被使用的。然而在主流的 Java 虚拟机里未选用引用计数算法来管理内存主要原因是它难以解决对象之间相互循环引用的问题所以出现了另一种对象存活判定算法。可达性分析法通过一系列被称为『GCRoots』的对象作为起始点从这些节点开始向下搜索搜索所走过的路径称为引用链当一个对象到 GC Roots 没有任何引用链相连时则证明此对象是不可用的。其中可作为 GC Roots 的对象虚拟机栈中引用的对象主要是指栈帧中的本地变量 *、本地方法栈中 Native 方法引用的对象、方法区中 类静态属性引用的对象、方法区中常量引用的对象。强引用置为 null会不会立即回收不会立即释放对象占用的内存。如果对象的引用被置为 null只是断开了当前线程栈帧中对该对象的引用关系而 垃圾收集器是运行在后台的线程只有当用户线程运行到安全点 (safe point) 或者安全区域才会扫描对象引用关系扫描到对象没有被引用则会标记对象这时候仍然不会立即释放该对象内存因为有些对象是可恢复的在 finalize 方法中恢复引用 。只有确定了对象无法恢复引用的时候才会清除对象内存。内存泄漏排查‌除了用LeakCanary要能讲清楚如何通过Profiler捕获heapdump、分析引用链找到持有对象的元凶比如static变量、未解绑的receiver等 。由浅入深聊聊 LeakCanary 的那些事-CSDN博客
返回列表