- 移动端—内存泄漏
内存泄漏定义:指程序在向系统申请分配内存空间后,在使用完毕后未释放。
Java 是在 JVM 所虚拟出的内存环境中运行的。
JVM 的内存可分为三个区:
堆(heap)、栈(stack)和方法区(method)。
栈(stack)
是简单的数据结构,但在计算机中使用广泛。栈最显著的特征是:LIFO(Last In, First Out, 后进先出),栈中只存放基本类型和对象的引用(不是对象)
堆(heap)
堆内存用于存放由 new 创建的对象和数组。在堆中分配的内存,由 Java 虚拟机自动垃圾回收器来管理。JVM 只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
方法区(method)
又叫静态区,跟堆一样,被所有的线程共享。方法区存放静态数据、全局static 数据和常量
当某方法运行结束时,该方法对应的 frame(帧) 将会从栈中删除,frame 中所有局部变量和参数所占有的空间也随之释放。 线程回到原方法继续执行,当所有的栈都清空的时候,程序也就随之运行结束。
而对于堆内存,堆存放着普通变量。在 Java 中堆内存不会随着方法的结束而清空,所以在方法中定义了局部变量,在方法结束后变量依然存活在堆中。
内存泄漏区:栈(stack)可以自行清除不用的内存空间。但是如果我们不停的创建新对象,堆(heap)的内存空间就会被消耗尽。所以内存泄漏会发生在堆区。
-
如何测试内存泄漏
测试方式:
有源码+Android studio环境,接助profiler步骤:
1.打开 App,进入到默认页面(首页),手动触发 GC,记录此时的内存值;
2.测试结束后,返回到默认页面,手动触发 GC,同时记录此时的内存值;
3.两者做比较,发现值存在较大差异,可以断言发生了内存泄漏;
4.此时可以点击 Dump Java Heap,收集此时的内存信息,完成之后会自动保存在后缀为 hprof 文件中;
5.拿 hprof 文件做具体分析即可(可提交给开发)
无源码,有debug版本的APK包,借助DDMS工具的操作步骤:
1.打开 monitor.bat,链接设备;
2.选择要调试的进程,打开调试 App-> 进入到首页;
3.点击 Update heap->Cause GC,记录下此时 data object 这一栏数据;
4。测试结束后,返回到默认页面,点击 Cause GC,同时记录 data object 这一栏数据;
5.前后两者做对比,发现值存在较大差异,可以断言发生了内存泄漏;
6.此时点击 Dump HPROF file 按钮,获取保存有内存信息的 hprof 文件;
7.拿 hprof 文件做具体分析即可(可提交给开发)
备注:DDMS是Android SDK中自带的调试工具,新版本的sdk中,DDMS工具已经集成到了Android device mointor中 -
LeakCanary+Monkey定位内存泄漏(推荐)
参考地址:https://www.cnblogs.com/yyoba/p/13205025.html -
缓存的测试点
功能:
缓存是否可以正确被创建,包括位置、名字和内容;
缓存是否被清除,包括主动清楚以及被第三方发起的清除,清除后是否正常工作及清除失效的情况;
系统运行过程中,redis缓存数据生效、缓存的数据读取正确、数据写入落地正确,数据有效期设置合理;
缓存与数据库的数据一致性检测;
DB事务性导致回滚,缓存是否回滚,有没有产生脏数据;
缓存是否有大小限制,达到大小临界值如何处理;
缓存时突然被中断,如何处理;
缓存失效后,是否能正常表现;
自动化:
自动化用例中断言部分设计缓存层断言并且自动化框架本身对于断层层次可配置;
性能及稳定性:
关注业务本身应用场景及缓存结构,是否使用缓存;
预防缓存穿透、缓存雪崩、缓存击穿引发的系统风险;
扩容:
关注扩容方案设计、老数据备份策略、回滚方案;
关注扩容后分片策略的变化;
扩容后热点数据失效率或命中率以及对后端DB带来的压力;
环境:
无网络&有数据:
缓存大小未超过,缓存时间有效期内,显示缓存数据加载;
缓存大小超过,本地缓存数据删除,显示无网提示,无数据加载;
缓存时间过期,本地缓存数据删除,显示无网提示,无数据加载;
无网络&无数据:
显示无数据加载;
有网络&有数据:
缓存大小未超过,缓存时间有校内,显示缓存数据加载;
缓存大小超过了,本地缓存数据删除,直接从线上拉取数据;
缓存时间过期,本地缓存数据删除,直接从线上拉取数据;
有网络&无数据:
直接从线上拉取数据存到本地;
缓存存储:
客户端安装后,有网络,开始存储数据到本地;
覆盖安装,缓存数据依然存储在本地;
清除数据、卸载、重装,内存和本地缓存数据清零;
异常情况:
由于网络原因缓存失败,则无法读取缓存数据;
由于服务器原因导致缓存失败,则无法取缓存数据;
终端本地的数据接近满值,内存被占用,无法读取缓存数据;
设置的缓存文件夹和数据文件不可读写;
缓存的刷新机制是否手动操作;
参考地址:http://www.51ste.com/share/det-762-1.html