2024年4月9日发(作者:甘涵)
一、
android
内存机制
Android
的程序由
Java
语言编写,所以
Android
的内存管理与
Java
的内
存管理相似。程序员通过
new
为对象分配内存,所有对象在
java
堆内分配空间;
然而对象的释放是由垃圾回收器来完成的。
C
/
C++
中的内存机制是“谁污染,
谁治理”,
java
的就比较人性化了,给我们请了一个专门的清洁工(
GC
)。
那么
GC
怎么能够确认某一个对象是不是已经被废弃了呢?
Java
采用了有
向图的原理。
Java
将引用关系考虑为图的有向边,有向边从引用者指向引用对
象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,
GC
不会回收这些对象。根顶点可以到达的对象都是有效对象,如果某个对象
(
连
通子图
)
与这个根顶点不可达
(
注意,该图为有向图
)
,那么我们认为这个
(
这些
)
对
象不再被引用,可以被
GC
回收。
二、内存泄漏原因
导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序
中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让
垃圾回收器
GC
验证这些对象是否不再需要。如果存在对象的引用,这个对象就
被定义为
"
有效的活动
"
,同时不会被释放。要确定对象所占内存将被回收,我们
就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为
null
或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为
null
,因为
一个方法执行完毕时,这些引用会自动被清理。
在
Java
中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特
点,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路可以与其
相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满
足这两个条件,这些对象就可以判定为
Java
中的内存泄漏,这些对象不会被
GC
所回收,然而它却占用内存。
三、内存泄漏测试方法
内存泄漏的测试方法其实也没什么特别的,一句话就是:监控测试场景下应
用程序
(
进程
)
的内存变化信息。但是测试开始之前我们还是有三件事要去做。第
一,我们需要一个监控工具
(monitor)
,能实时
(
每隔一个时间片
)
采样应用程序
的内存数据信息;第二,测试用例,开始测试前我们要分析并制定内存可能泄漏
的场景;第三,执行测试自动化脚本,避免手工操作对测试数据带来一些影响(对
CPU
的影响比较大)。
1.
准备工作
1.1
监控工具
测试时使用是名叫
AndroidresMonitor
的
python
脚本工具,工具的具体的
介绍请参见
/group/3277/articles/show/140708
,此处不
做详细介绍。
1.2
测试用例
内存泄漏的测试用例和功能测试有几个不同点:
1)
操作的重复性
我们设计的测试场景要是重复性的。对于轻微的内存泄漏,我们可以通过操作次
数的递增来积累泄漏的内存数量,直到我们能清晰的在曲线变化上内存的泄漏问
题。
2)
操作闭环
我们的测试场景必须是闭环的。这样我们才能横向对比不同次数的数据信息。
3)
数据读写操作
2024年4月9日发(作者:甘涵)
一、
android
内存机制
Android
的程序由
Java
语言编写,所以
Android
的内存管理与
Java
的内
存管理相似。程序员通过
new
为对象分配内存,所有对象在
java
堆内分配空间;
然而对象的释放是由垃圾回收器来完成的。
C
/
C++
中的内存机制是“谁污染,
谁治理”,
java
的就比较人性化了,给我们请了一个专门的清洁工(
GC
)。
那么
GC
怎么能够确认某一个对象是不是已经被废弃了呢?
Java
采用了有
向图的原理。
Java
将引用关系考虑为图的有向边,有向边从引用者指向引用对
象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,
GC
不会回收这些对象。根顶点可以到达的对象都是有效对象,如果某个对象
(
连
通子图
)
与这个根顶点不可达
(
注意,该图为有向图
)
,那么我们认为这个
(
这些
)
对
象不再被引用,可以被
GC
回收。
二、内存泄漏原因
导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序
中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让
垃圾回收器
GC
验证这些对象是否不再需要。如果存在对象的引用,这个对象就
被定义为
"
有效的活动
"
,同时不会被释放。要确定对象所占内存将被回收,我们
就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为
null
或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为
null
,因为
一个方法执行完毕时,这些引用会自动被清理。
在
Java
中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特
点,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路可以与其
相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满
足这两个条件,这些对象就可以判定为
Java
中的内存泄漏,这些对象不会被
GC
所回收,然而它却占用内存。
三、内存泄漏测试方法
内存泄漏的测试方法其实也没什么特别的,一句话就是:监控测试场景下应
用程序
(
进程
)
的内存变化信息。但是测试开始之前我们还是有三件事要去做。第
一,我们需要一个监控工具
(monitor)
,能实时
(
每隔一个时间片
)
采样应用程序
的内存数据信息;第二,测试用例,开始测试前我们要分析并制定内存可能泄漏
的场景;第三,执行测试自动化脚本,避免手工操作对测试数据带来一些影响(对
CPU
的影响比较大)。
1.
准备工作
1.1
监控工具
测试时使用是名叫
AndroidresMonitor
的
python
脚本工具,工具的具体的
介绍请参见
/group/3277/articles/show/140708
,此处不
做详细介绍。
1.2
测试用例
内存泄漏的测试用例和功能测试有几个不同点:
1)
操作的重复性
我们设计的测试场景要是重复性的。对于轻微的内存泄漏,我们可以通过操作次
数的递增来积累泄漏的内存数量,直到我们能清晰的在曲线变化上内存的泄漏问
题。
2)
操作闭环
我们的测试场景必须是闭环的。这样我们才能横向对比不同次数的数据信息。
3)
数据读写操作