一.Android 的内存机制
Android 的程序由 Java 语言编写,所以 Android 的内存管理与 Java 的内存管理相似。
程序员通过 new 为对象分配内存,所有对象在 java 堆内分配空间;然而对象的释放是由
垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java 的就比较人性化
了,给我们请了一个专门的清洁工(GC)。
那么 GC 怎么能够确认某一个对象是不是已经被废弃了呢?Java 采用了有向图的原理。
Java 将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有
向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对
象,GC 不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为
有向图),那么我们认为这个(这些)对象不再被引用,可以被 GC 回收。
二.android 中常有的内存溢出原因
,大量位图的加载
有时候我们需要从网络上获取大量的图片并且展现在 中,但是如果图片较大,一次性
加载大量 ,那么程序可用内存会瞬间增长,引起 ,通常的解决方法是开始不
加载位图,设置 的 为 ,先获取到宽高,这时
候位图并不会加载到内存中,然后计算缩放比例再加载位图适应 控件,这样可以避免
的产生
, 对象不在使用时调用 释放内存
有时我们会手工的操作 对象,如果一个 对象比较占内存,当它不在被使用
的时候,可以调用 方法回收此对象的像素所占用的内存,但这不是必须的,
视情况而定。
,查询数据库没有关闭游标
程序中经常会进行查询数据库的操作,但是经常会有使用完毕 后没有关闭的情况。
如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情
况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
!,构造 " 时,没有使用缓存的#
以构造 $# 的 " 为例,在 " 中提高了方法:
%#&#'##'#(
来向 $# 提供每一个 所需要的 对象。初始时 $# 会从 " 中根
据当前的屏幕布局实例化一定数量的 对象,同时 $# 会将这些 对象缓存起来。
当向上滚动 $# 时,原先位于最上面的 的 对象会被回收,然后被用来构
造新出现的最下面的 。这个构造过程就是由 &#方法完成的,&#的第二
个形参## 就是被缓存起来的 的 对象初始化时缓存中没有
对象则 # 是 。如果我们不去使用 #,而是每次都在 &#中重
新实例化一个 # 对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
三.设计中需要注意的问题