既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
四、 系统级别的内存管理
1)LMK机制和oom_adj的值
Android内核有个专用的驱动low-memory-kill,当系统级别的内存不够的时候会根据oom_adj的值以及内存分配状况去kill掉某个进程,oom_adj可以在/proc/[pid]/oom_adj看到,并且这个值会随着进程的状态改变而改变,比如系统进程一般是-16,越大越容易被干掉。
2)5个进程的优先级
前台进程:当前运行的,基本不死 ;
可见进程:界面可以见到,比如被遮挡 ;
服务进程:进程带后台服务的,比如播放器 ;
后台进程:点击home键,但不退出,就是后台进程了,有比较大几率会被杀;
空进程:退出应用程序,还在后台保留这空进程,为的是加快启动速率,最优先。
五、内存抖动
内存抖动是指内存频繁地分配和回收,而频繁的GC会导致卡顿,严重时还会导致OOM(主要原因还是有因为大量小的对象频繁创建,导致内存碎片,从而当需要分配内存时,虽然总体上还是有剩余内存可分配,而由于这些内存不连续,导致无法分配,系统直接就返回OOM了)
六、内存名词VSS、RSS、PSS、USS解释
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
大小规律:
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
image.png
七、 内存值获取方法
使用命令 adb shell dumpsys meminfo package_name 获取内存信息,如日历的内存信息如下:
image.png
PSS Total:进程各部分内存的消耗,是所有进程PSS相加得到系统占用内存的总和
Native Heap:Native代码分配的内存,虚拟机和Android框架分配内存。关于什么是Native代码,即非Java代码分配的内存
Dalvik Heap:Java对象分配的占据内存
Dalvik Other:类数据结构和索引占据内存
Stack:栈内存
Private Dirty:它基本上是进程内不能被分页到磁盘的内存,也不和其他进程共享,private Dirty内存是最重要的部分,因为只被自己进程使用
Private Clean:是已经映射持久文件使用的内存页(例如正在被执行的代码),因此一段时间不使用的话就可以置换出去
Heap Alloc:是Dalvik堆和本地堆分配使用的大小,它的值比Pss Total和Private Dirty大,因为进程是从Zygote中复制分裂出来的,包含了进程共享的分配部分
Ashmem:不以dalvik-开头的内存区域,匿名共享内存用来提供共享内存通过分配一个多个进程,Android匿名共享内存是基于Linux共享内存的,都是在tmpfs文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是,Android在Linux的基础上进行了改造,并借助Binder+fd文件描述符实现了共享内存的传递。
Other dev:内部driver占用的内存
.so mmap:C 库代码占用的内存
.jar mmap:Java 文件代码占用的内存
.apk mmap:apk代码占用的内存
.ttf mmap:ttf 文件代码占用的内存
.dex mmap:Dex 文件代码占用的内存
Other mmap:其他文件占用的内存
八、 测试场景选择
内存出现泄漏的前提条件一定是有新的内存分配,所以测试场景会选择有新对象创建的场景,并结合用户的使用场景和频率来确定优先级。测试场景主要有以下三种情况,配合测试次数,然后可以每5次获取一次内存值进行判断,一般测试300次,如果各种内存测试完成并等待5分钟后内存没有释放,则高概率存在内存泄露:
1)新画面打开
由于新的画面打开,就会创建新的Activity和View,并有许多其他对象被创建。
测试方法:
反复进入退出需要测试的目标Activity,如果发现Activities和Views的一直在增长,则内存泄露一定发生(退出时如果手动GC,则Activities和Views的数量应该为0)
2)画面旋转
当屏幕旋转时,Orientation设置发生了改变,当前显示的Activity会被重新创建。
测试方法:进入需要测试的目标Activity,反复横竖屏切换,如果发现Activities数量等其他值一直在增长,则内存泄露一定发生
3)滑动屏幕
滑动屏幕会使屏幕中显示的对象(比如浏览器小说阅读内容)创建。
测试方法:进入需要测试的目标Activity,一直固定某个方向滑动(向左),如果发现内存值一直在增长,则内存泄露一定发生
Case例子,仅供参考:
image.png
测试过程中的值记录模板,仅供参考:
image.png
注意:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
cJ5jC-1715121874074)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新