最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Android内存泄漏

IT圈 admin 34浏览 0评论

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)

数据读写操作

发布评论

评论列表 (0)

  1. 暂无评论