Android 内存优化
内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出
Android 系统垃圾回收机制
内存管理机制: Low Memory killer
最理想的状态,就是用完了就回收
实际情况 ,懒人机制,当新的进程需要使用时,内存不够了才去回收
隐患: GC出发之后,所有进程都会暂停
内存:
Android 基于lInux, app 运行在沙箱机制,就是一个app独立运行咋一个虚拟机中,及时出错了也不会影像系统,运行的 过程叫做进程。
adb shell -> ps 会打印出所有的进程
-> sumpsys meminfo 包名 打印对应进程的内存情况
application 主进程 :
getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext())){
// 可以进程一些任务的初始化
}
//内存获取
ActivityManager am = getSystemService(ACTIVITY_SERVICE);
//最大内存
int max = am.getMemoryClass();
// 开启硬件加速后的最大内存
int large = am.getLargeMemoryClass();
也可以在清单文件的 <Application> 中添加 android:largeHeap="true"
Low memory Killer : app启动和销毁
app的启动和销毁管理机制 : Activity栈 ,先进先出,系统保护机制 -> Lru Cache (缓存淘汰机制)
// 获取运行时内存
int total = Runtime.getRuntime().totalMemory() *1.0f /(1024 *1024);
也可以通过使用工具来查看内存情况。
内存优化:
1, 良好的编码习惯
2, 通过内存管理工具 Mat 查看内存情况
可以 通过 MAT 工具下载 hprof log日志分析, 使用 sdk/platform-tools/hprof-conv 工具转换
leakCanary 库检测内存
布局性能优化:
Layout Inspector 检测嵌套
优化手段:
include
merge
ViewStub
Android 启动优化
冷启动
重启之后第一次启动,首次安装等没有缓存
热启动
关闭了app再打开
温启动
切换到后台,大部分数据保留。
检测app Activity 的启动时间
1, Shell
ActivityManager - > adb shell am start -S -W 包名/ 包名+Activity路径
2, Log
ActivityManager 增加了Log TAG = displayed
主要是针对冷启动的优化:
冷启动经过的步骤:
1,第一次安装,加载应用程序并且启动
2,启动后显示一个空白的窗口 getWindow(), setWinsoeBackground()
3, 启动/创建应用进程
App内部:
1,创建app对象/application对象
2,启动主线程(Main/UI Thread)
3, 创建应用入口 / Launcher
4, 填充ViewGroup中的View
5, 绘制View measure - > layout -> draw
优化的手段:
1,视图优化
1, 设置主题透明
theme 中添加
<item name = “android:windowIsTranslucent”>true</item>
2, 设置启动图片 ·······setWindowBackground();
在启动后添加一个窗口时不让它空白,提前设置一张静态图片
<item name="android:windowBackground">@drawable/ic_launcher_background</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
2,代码优化
1, 优化Application , 不要负担太多工作
2,布局优化,不要繁琐的布局
3,阻塞UI 线程的操作 要不得
4, 加载Bitmap大图 尽量去压缩
5,其他一些占用主线程的操作。
Application的优化
/**
* Application 的优化
* 1, 必要的组件可以放在MainActivity 中去初始化
* 2,如果必须要在Application 中初始化的组件,尽可能延时
* 3,非必要的组件,可以放在子线程中去做。
*/
@Override
public void onCreate() {
super.onCreate();
context = this;
new Thread(new Runnable() {
@Override
public void run() {
// 做一些初始化的工作
}
}).start();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 或者在这里做一些初始化的工作;
//Bmob 初始化
BMobManager.getInstance().initBMob(MeetApplication.this);
}
}, 1500);
}
网友评论