每一个手机厂商都可以设定设备中每一个进程能够使用的堆大小 , 设置进程堆大小的值有下面三个 。
- dalvik.vm.heapstartsize 堆分配的初始值大小 , 这个值越小 , 系统内存消耗越慢 , 但是当应用扩展这个堆 , 导致 GC 和堆调整时 , 应用会变慢 。这个值越大 , 应用越流畅 , 但是可运行的应用也会相对减少 。
- dalvik.vm.heapgrowthlimit 如果在清单文件中声明 largeHeap 为 true , 则 App 使用的内存到 heapsize 才会 OOM , 否则达到 heapgrowthlimit 就会 OOM 。
- dalvik.vm.heapsize 进程可用的堆内存最大值 , 一旦应用申请的内存超过这个值 , 就会 OOM 。
adb shell getprop dalvik.vm.heapsize
3. 什么是 ART?
ART 的全称是 Android Runtime , 是从 Android 4.4 开始新增的应用运行时环境 , 用于替代 Dalvik 虚拟机 。
Dalvik VM 和 ART 都可以支持已转换为 .dex(Dalvik Executable)格式的 Java 应用程序的运行 。
ART 与 Dalvik 的区别有下面几个 。
- 预编译 Dalvik 中的应用每次运行时 , 字节码都需要通过即时编译器 JIT 转换为机器码 , 这会使得应用的运行效率降低 。在 ART 中 , 系统在安装应用时会进行一次预编译 , 将字节码预先编译成机器码并存储在本地 , 这样应用就不用在每次运行时执行编译了 , 运行效率也大大提高 。
- GC 在 Dalvik 采用的垃圾回收算法是标记-清除算法 , 启动垃圾回收机制会造成两次暂停(一次在遍历阶段 , 另一次在标记阶段) 。而在 ART 下 , GC 速度比 Dalvik 要快 , 这是因为应用本身做了垃圾回收的一些工作 , 启动 GC 后 , 不再是两次暂停 , 而是一次暂停 。而且 ART 使用了一种新技术(packard pre-cleaning) , 在暂停前做了许多事情 , 减轻了暂停时的工作量 。
- 64 位 Dalvik 是为 32 位 CPU 设计的 , 而 ART 支持 64 位并兼容 32 位 CPU , 这也是 Dalvik 被淘汰的主要原因 。
在 Android 中有一个心狠手辣的杀手 , 要想让我们的应用活下来 , 就要在开发应用时格外小心 。
不过我们也不用太担心 , 因为它只杀“坏蛋” , 只要我们不使坏 , 那它就不会对我们下手 。
这个杀手叫低杀 , 它的全名是 Low Memory Killer 。
低杀跟垃圾回收器 GC 很像 , GC 的作用是保证应用有足够的内存可以使用 , 而低杀的作用是保证系统有足够的内存可以使用 。
GC 会按照引用的强度来回收对象 , 而低杀会按照进程的优先级来回收资源 , 下面我们就来看看 Android 中的几种进程优先级 。
4.2 进程优先级
在 Android 中不同的进程有着不同的优先级 , 当两个进程的优先级相同时 , 低杀会优先考虑干掉消耗内存更多的进程 。
也就是如果我们应用占用的内存比其他应用少 , 并且处于后台时 , 我们的应用能在后台活下来 , 这也是内存优化为我们应用带来竞争力的一个直接体现 。
当用户通过多次点击达到一个页面 , 然后又打开了其他应用时 , 这时我们的应用处于后台 , 如果我们的应用在后台能活下来 , 意味着当用户再次启动我们的应用时 , 不需要再次进行这个繁琐的操作 。
推荐阅读
- Java对象的内存分配过程是如何保证线程安全的?
- redis内存使用分析
- 中国茶路文化遗产保护与开发探索以湖南省为例
- 厉害了华为!先于美国禁令建立内存芯片库,存量能安然度过2020年
- 电商网站架构探索之SOA
- Redis内存又不够用了?教你几种集群方案轻松甩掉存储难题
- 谷歌|首发Android 13!谷歌Pixel 7 Pro渲染图曝光:后摄神似iPhone 14 Pro感叹号挖孔
- 群探索者的努力让茶馆成为传播茶文化的前沿阵地
- 手机内存不够?教你6招,立马多出几个G
- CPU,显卡,内存等硬件的频率是啥
