Android 内存、I/O、网络、存储的优化思路

本文详细探讨了Android应用的内存优化,包括内存模型、内存限制、内存泄漏及其检测工具。针对IO优化,介绍了DataStore替代SharedPreferences以及Netty的ByteBuf的优势。网络优化方面,讲解了DNS优化、连接优化和数据传输优化策略。存储优化部分,讨论了ContentProvider、Serializable、Parcelable的优缺点,以及Room数据库的优势。
摘要由CSDN通过智能技术生成

一 内存优化

1.1 内存模型与分布

image.png

上图是常见的java虚拟机的内存分布图:

  • 方法区:主要存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。内存优化时这一部分主要考虑是不是加载了很多不必要的第三方库。这部分的内存减少主要是常量池的回收和类的卸载(类卸载条件:无引用,类加载器可卸载)。

  • 堆:几乎所有的对象都在这个区域产生,该区域属于线程共享的区域,所以写代码时更要注意多线程安全。这个内存区域的大小变化主要是对象的创建和回收,比如:如果短时间内有大量的对象创建和回收,可能会造成内存抖动,如果对象创建之后一直回收不掉,则会导致内存泄漏,严重的内存泄漏会导致频繁的gc,从而是界面卡顿。

  • 虚拟机栈:这个区域描述的是java方法执行的内存模型,我们常说的方法栈的入栈就是将方法的栈帧存储到虚拟机栈,这个区域是线程私有的,其生命周期就是线程的生命周期。也就是说每个线程都会有,默认一个线程的线程栈大小是1M,这不包括在方法中产生的其他对象的大小。这一块我们能控制的就是线程的数量,特别是程序中没有使用线程池或者使用的多个第三方库都带有线程池的情况。

  • 本地方法栈:同虚拟机栈的作用非常类似,是为虚拟机执行native方法服务的,所以需要注意的地方也和虚拟机栈一样,特别是使用了第三方so的情况。

  • 程序计数器:当前线程执行的虚拟机字节码的行号记录器,占用的内存较小,可以不考虑。

1.2 内存限制

android是基于Linux系统的,android中的进程分为两种。

1.2.1 native进程

采用C/C++实现,不包含dalvik实例的linux进程,/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。

1.2.2 java进程

实例化了dalvik虚拟机实例的linux进程,进程的入口main函数为java函数。dalvik虚拟机实例的宿主进程是fork()系统调用创建的linux进程,所以每一个android上的java进程实际上就是一个linux进程,只是进程中多了一个dalvik虚拟机实例。

手机操作系统对每个app进程的内存是有限制的,可以通过如下命令查看限制大小:

adb shell getprop | grep dalvik.vm.heapgrowthlimit
复制代码

可以在Androidmanifest文件中application节点加入android:largeHeap=“true”来增加其dalvik虚拟机中堆的大小

1.3 内存泄漏

常见的内存泄漏:

  1. 静态引用(自身
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值