内存相关概览
(1)系统处理内存申请顺序
(2)GC介绍
GC种类
GC_CONCURRENT 废弃对象回收
GC_FOR_MALLOC 堆上资源不够,请求分配内存
GC_BEFORE_OOM 在oom前最后进行一次gc
GC_EXPICIT 调用系统
GC流程
(3)虚拟机
Dalvik虚拟机
基于寄存器的指令集,可提前优化,执行速度快,代码长度更长,兼容性差
进程独占的虚拟机
定制字节码格式 dex
Java虚拟机
基于堆栈的指令集,字节格式class
ART 4.4引入,5.0设为默认
使用AOT代替JIT,预编译。安装耗时长
混合编译模式 Android.N引入
安装:解释 运行:JIT All-of-the-Time
(4)进程初始化
Zygote
(5)内存结构
(6)apk结构
注:dex和lib同一个app不同进程是可以共享的
(7)查看内存
使用procrank命令,pss降序排序
注:pss为真实内存反应
(8)进程优先级
值越小,优先级越高
代码示例
/**
* 这是一个前台服务的例子,在onCreate之后调用startForeground开启。
* 启动前台服务后,宿主进程退到后台后,进程优先级会保留为前台进程。
*/
public class ForegroundService extends Service {
public ForegroundService() {
}
@Override
public void onCreate() {
super.onCreate();
startForeground();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
private void startForeground() {
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("前台服务")
.setContentText("这是前台服务的提醒")
.setContentIntent(pendingIntent);
//设置成前台服务
startForeground(330, builder.build());
}
}
(9)Low Memory Killer