通常来说,对内存的管理、优化有以下两种方式:
- 在对象不需要的时候确保对象能够被销毁
- 如果对象没有被销毁,则该对象一定是作为可以复用的对象。(单例)
内存区分
寄存器(Registers):用于存储指令,地址,数据。
栈(Stack):存放基本类型的数据,对象的引用和函数地址等,由系统控制。
堆(Heap):存放对象本身和数组,由开发者控制。
静态域(Static field):存储静态变量。
常量池(constant pool):存储常量。
堆/栈 | GC管理 | 存取速度 |
---|---|---|
堆 | 由GC系统控制,变量生命周期结束后,由GC决定何时收回 | 慢 |
栈 | 由虚拟机控制,变量生命周期结束后,由虚拟机释放该变量占用的内存空间 | 快 |
Dumpsys Meminfo
adb dumpsys meminfo 指令是Apps-Running的底层实现的,可以dump出当前系统的内存使用状态,如果不指定包名,则dump整个系统的内存分配状态。通常使用中,需要指定包名来获取自己App的内存分配状态。
adb dumpsys meminfo com.xxx.xxx
shared内存与private内存
private内存,即完全属于每个应用独享的那部分已经分配的内存。
shared内存,Android中的基础公共库、组件、还有一些Native 的libraries,Android系统为了节省内存资源,为他们提供了公共的内存资源。这些内存被所有运行的进程所共享。
Android进程始于Zygote进程,Zygote进程是一切进程的来源,公共资源、组件和native的library都在Zygote中初始化。其他进程通过fork的方式产生新的进程,这样新的进程产生时就已经带有了Shared内存所预先加载的内容,从而提高了应用进程的创建速度。