内存分配android
A. android 4.0给每个应用程序分配多少内存,还是动态分配的吗
android 4.0给每个应用程序分配内存是动态分配的。
应用程序,指为完成某项或多项特定工作的计算机程序,它运行在用户模式,可以和用户进行交互,具有可视的用户界面。
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。
B. android studio怎么分配模拟器内存不足
按他的意思是指用于启动虚拟机的内存不够,不过你去设置jvm的启动内存也没有用,找了半天,终于知道个方法打开工程的gradle.properties文件,添加org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m,问题就解决了,其实google在这个文件的注释已经有告诉我们这个用法,就是用来设置android studio的启动内存,我们从这里知道,android
studio的默认最大内存是10g,所以对于我们这些4g,8g内存的电脑来说,内存确实不够用,不过为什么有时不会出问题有时会,可能是google优化不好吧,但这又有个问题,我把参数改为1g,2g都不行,一定要设置为512m才行,只能说明android
studio确实有bug。
网上找的,你试试看,你的错误代码都没显示完全
C. 安卓的内存卡怎样分区
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!安卓手机如何给内存卡分区~ 参考资料:
储器(ROM)两种。手机ROM相当于PC上的硬盘,用于存储手机操作系统和软件,也叫FLASH ROM,决定手机存储空间的大小。手机RAM相当于PC的内存,其大小决定手机的运行速度。
要把大象装冰箱里总共分三步,而Android系统中把软件安装到SD卡上,比这还简单,两步就够了:
一、存储卡分区
首先我们需要对手机SD卡进行分区,分一个FAT32分区和一个Ext3分区,FAT32分区用于正常存储图片、音乐、视频等资料,而linux格式的Ext3分区就是用于扩容安装软件的分区。以笔者的2G SD卡为例,FAT32分区1.35GB,Ext3分区494MB。下载并安装Acronis Disk Director Suite软件。将手机SD卡装入读卡器并连接电脑,然后运行Acronis Disk Director Suite软件。
1.FAT32分区。找到代表SD卡的磁盘分区,点击右键,选择“删除”命令,删除已有分区。当成为“未分配”分区时,点击右键,选择“创建分区”,在弹出的对话框中,文件系统选择:FAT32,创建为“主分区”,设置好分区大小1.35GB,点击确定按钮。
2.Ext3分区。在剩余的494MB分区上,点击右键,选择“创建分区”,在弹出的对话框中,文件系统选择:Ext3,创建为“主分区”,设置好分区大小494MB,点击确定按钮。
3.确认分区。上述分区设定完成后,软件只是记录了分区操作,并没有真正在SD卡上进行分区。点击软件工具栏中的“提交”按钮,确认执行分区操作,提示“操作成功完成”说明分区成功了。
二、将软件移动到SD卡
存储卡分区完成后我们只需要把系统默认的软件安装目录/data/app转移到SD卡的Ext3分区上,然后通过ln命令建立软链接,使系统自动把软件安装到SD卡上,达到节省手机内存空间的目的。
将存储卡装回手机,重新启动,使系统识别到Ext3分区。在手机上运行超级终端,依次输入以下命令来验证系统是否识别了Ext3分区:
su (会提示高级权限授权,选择“总是同意”)
busybox df –h
如果显示的列表中有/dev/block/mmcblk0p2的信息说明系统已成功识别了Ext3分区。
然后依次输入以下命令将/data/app目录转移到SD卡的Ext3分区:
cp –a /data/app /system/sd/
(将/data/app目录复制到/system/sd/下)
rm –r /data/app
(删除/data/app目录)
ln –s /system/sd/app /data/app
(建立软链接)
Reboot
(重启手机)
重启之后,手机上安装的所有软件就全部转移到了SD卡上,看看你的手机可用空间是不是增大了。以后再安装软件也是直接安装到SD卡上,不用担心空间不足的问题了,而且这样做还有一个好处,刷新ROM后,以前安装过的软件并没有被清除,还保存在SD卡上,输入下列命令就可以轻松恢复,不用再一一安装了,非常方便实用。
su
(取得高级权限)
cd /data
(进入/data目录)
cp –a app /system/sd/app
(将app目录中的内容复制到/system/sd/app目录)
rm –r app
(删除app目录)
ln –s /system/sd/app /data/app
(建立软链接)
reboot
(重新启动)
扩容效果体验:
刷新ROM后未安装任何软件,手机可用空间为87MB,安装若干软件后,可用空间下降为73MB。将软件目录转移到SD卡上后,可用空间变为80MB。可能有的“电筒”会有疑惑,为什么没恢复到87MB呢?这是因为我们只是将软件移动到了SD卡上,而软件的缓存数据仍然会占用手机内存,所以手机内存还是会下降。当然软件的缓存数据也可以移动到SD卡上,但这样会拖慢软件运行速度,所以不推荐大家使用。
注意事项:
1.软件移动到SD卡上后,原有的部分桌面插件会无法正常显示,删除后,重新加入桌面即可。
2.SD卡的Ext3分区可以视为手机硬件的一部分,移除SD卡后,安装的软件将无法运行。插入SD卡,重新启动手机即可正常使用。
这个教程有哪个高手可以成功的话,给我说一声哦!
引用 报告 回复
-
D. 安卓用户请进,关于RAM内存问题
有很多同学表示,自己的机子开机内存怎么只有200m啦,用一会怎么就变成100多m啦,怎么有很多程序在后台关都关不了啦。有这个疑惑的看一下内容。
首先你要知道Android系统 是 基于Linux 2.6内核开发的开源操作系统(linux是啥都不知道自己去网络吧),而linux系统的内存管理有其独特的动态存储管理机制。不过Android系统对Linux的内存管理机制进行了优化,Linux系统会在进程活动停止后就结束该进程,而Android把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户 再次激活这些进程时,提升了进程的启动速度。
如果你懂java,就会更容易理解Android系统的内存管理机制。与java的内存回收收机制类似,系统有一个规则来回收内存。进行内存调度有个阈值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。Android系统有六类进程:前台进程、可见进程、次要服务、后台进程、内容供应节点、空进程。对于高手 而言可以用MinFreeManager之类的软件进行进程管理,分别为六类进程设定不同的阈值来操纵系统的内存分配机制。不过对于一般用户而言,Android系统默认的分配机制已经可以满足使用需要,因此也不需要再去调整。
对于一些内存很低的低端Android机而言,系统默认的内存分配机制无法实现很完善的内存调配。所以在运行大型游戏时需要先清理一下内存。然而对于中端的android手机而言,512m的总内存和几十m的空余内存已经可以充分的满足系统自动调配的需要,因此完全没有必要老去杀进程、清内存。
有的兄弟说后台挂着程序很费电,事实上Android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。至于QQ、音乐播放之类的程序可以在后台运行,是因为这些程序在后台开启了服务,而服务可以后台运行,所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源。
Android系统这样的设计不仅非常适合移动终端的需要,而且减少了系统崩溃的可能,确保了系统的稳定性。老想着清理内存的同学完全是因为被塞班或者 Windows毒害太深,事实上,经常用Taskiller之类的软件关闭后台所有进程,很容易造成系统的不稳定。很多时候出现问题,只要重启就能解决,其原因也在于此。
说了这么多,总结起来很简单,牛B的人自己去操纵系统内存分配的阈值,而普通用户则是想怎么用就怎么用,完全不用去鸟剩余内存的问题,那些内存清理的程序完全可以扔到一边了。 PS:
1.按home退出,程序保留状态为后台进程;按返回键退出,程序保留状态为空进程。空进程的oom_adj评值高于后台进程,更容易被系统清理。所以推荐用返回键退出。
2.UC、愤怒小鸟、都市赛车之类程序本身提供关闭功能 的,还是尽量主动关闭。浏览器 、电子市场、opera mini等不提供关闭功能的,直接返回键退出就行。
我想每个人第一次用Android的时候,不可避免的会去装个任务管理器,然后对里面时刻都停留着一大堆的程序表示触目惊心,然后会在桌面 上建立一个快捷清空内存的按钮,时不时啪的按一下,看着内存剩余数量从30多变成100多然后很有快感...其实吧,Android是Linux的内核,每一个程序都是一个独立的JAVA虚拟机,就和油汤里的油花一样互不干扰,这样充分保证了万一某个程序的JAVA虚拟机崩溃,系统依旧稳定正常运行.而 Android和传统Linux不一样的地方又在于,传统Linux在进程活动停止后就结束了,这就类似于我们用S60和WM一样,关闭程序,内存释放. 而Android会把这些进程保留在内存里,干嘛呢?为了保证你再次激活这些进程时候启动的更快,比如说我们挂在桌面的Widgets,具体一点我们拿新浪微博举例吧.我刚看完,退出,突然我想我发一条微博吧,那么这个时候我可以直接在桌面Widgets上操作----设想一下如果我退出的时候这个进程就终止了,那么我在桌面上点击Widgets的时候会不会卡顿一下甚至没有响应?----这就跟我们把Widgets挂在桌面的行为完全背离了,放在桌面上就是为了能随时观察到程序运行的情况,以及随时可以快速调用程序.所以Android并没有在进程活动停止就释放对应的内存.那么也许你还是会有疑问,那么内存够不够用呢?
512的内存被我们用的只剩56M是不是很蛋*疼*?其实系统一点也不卡的,蛋定蛋定
是的,我理解,因为大家这么多年Windows都用习惯了,Windows内存不足的时候机器卡的会让你想砸掉机箱,而且调用虚拟内存的时候硬盘喀喀喀想的让你肉疼.你肯定也会怕你的手机明明512M内存结果就剩下30来M把你卡到崩溃.事实上呢,Android会在系统需要更多内存的时候,去释放掉那些占用内存的进程----这个活动是智能的.最早大家认为是有个排序,比如最近使用过哪些程序(LRU机制,Last Recently Used),然后结束最早的进程.不过并非如此,否则就变成我们上小学时候那样,个子高的块头大的男生跟班长下去拔草扛新书,女生们留在班里绣花吧... 这样很明显不公平而且没准会结束掉那些我们并不想结束掉的进程----譬如说这会儿我想切回到刚才后台的网页继续浏览结果悲怆的发现它被系统给我强制关闭了...
Android把进程分成了一些优先级,比如
前台进程(Foreground),比如我们正在看书,那么看书的程序就是前台进程,这些进程是不会被系统优先结束的.当我把它切到后台的时候,它就变成后台进程了.
还有可见进程(Visible),这个怎么说呢,譬如输入法 程序,你平时是看不见它的,但是在你打开输入界面的时候,它会很快的弹出来,而不是让你等啊等啊等,看不到的原因是透明度的机制,咱就不要钻牛角尖讨论为啥我看不见了...还有桌面的Widgets,比如我们的桌面时钟,这个东西就是可见的,如果它被系统终止了会有什么样的结果?这个Widgets依然会显示在桌面上,但是时针不走了...
主要服务,比如说,电话 的拨号功能,你也不想正急着打电话呢结果人家给你卡半天吧,尤其像我这样联系人上2000的,载入一遍真的很慢啊...所以这些主要服务平时也不会被系统自动结束,除非你非要关它,关了也会自己重新加载的.这也是你完全释放内存以后过一会就看着内存可用值又慢慢降低的原因.
次要服务(secondary server),诸如谷歌企业套件,Gmail,联系人,看着这些程序出现在任务管理器里可能你会非常的莫名其妙,丫的这都哪跟哪啊我没开啊...其实它们和一些系统功能也是息息相关的,比如Gmail的邮件推送,我们时常需要用到它们,所以系统也太会去终止它们.甚至于台电Teclast机器上着名的Status BAR,这个也是次要服务,但是其实它承接着整个系统界面的运行,所以,如果你强行关闭所有进程的时候,你的屏幕会变成一片白...然后慢慢等Status BAR加载.
后台进程(hidden),就是我们通常意义上理解的启动后被切换到后台的进程,比如如浏览器和阅读器.后台进程的管理策略有多种,但是一般来讲,系统都会视内存情况,尽可能多的保留后台程序,这样会影响到你启动别的程序的运行速度----我想这个很好理解,因为内存确实不够了,而且你还没让系统自动释放内存.但好处是,你再次切换到这些已启动的程序时几乎是无缝的,速度绝对比你从0开始启动它要快得多.所以,这种后台进程在内存极度不够的时候,肯定会被系统选择性的干掉的.
内容供应节点(content provider),没有程序实体,仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等.在系统自动终止进程时,这类程序享有优先的被干掉权...
空进程(empty),没有任何东西在内运行的进程,有些程序在退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息.这部分进程无疑是系统最先终止的.
说了这么多,其实还是要结合实际的程序来看一下的,比如Android这个很有名的自动内存调配的软件,Auto Memory Manager,它的设置 和帮助界面就如上面所说的,它自动提供了多种默认配置,例如极速模式,这个模式下,会帮助你在设定好的临界值区间上,结束空进程以及内容供应节点等等低优先级保留权的进程,来给你腾出更多的内存,加速新运行程序打开的速度,但是它也说明了这种模式的弊端,就是一些可能你不想被关闭的进程会被过早的关闭,比如说,闹钟----在G2 G3还很火爆的2009年,很多用户在买完手机后给我抱怨,哎呀这个机器闹钟怎么老不响啊...上班老迟到...其实这就是因为手动结束进程的时候结果把闹钟也给干掉了.系统的时间是会一直走的,这属于主要服务,而闹钟呢,只是主要服务的一个附属品,所以被结束后,是不会自动被启动的,既然没有启动自然就不会响了.与此类似的例子就是里程碑不充电的BUG,这是因为Moto的机器里有个USB的进程,如果你把它结束后,理论上会重新启动的但是也会不启动,后面这种情况出现的结果就是你插充电器没反应,插数据线 连电脑 没反应...重启手机就好了.
当然我知道大家的洁癖很多,有的人就是见不得内存值太小...好吧如果你不想一些被系统认为不太重要而你又很需要的进程被你自己亲手扼杀的话,那么我推荐你使用高级任务管理器这个程序,你可以把一些进程自动隐藏起来,也就是说当你挥起狼牙棒横扫一堆进程的时候,你设置好的几个进程是不会受任何影响的,比如桌面Launcher,比如闹钟,比如USB,等等等等.但话说回来,我是不建议大家去手动管理Android的内存,也许你会不习惯----我也没啥好劝告的,总之,不要把你的智能机想的那么笨就行了.
刚才全杀掉进程后,过了一会,我们的爱机又变成剩余60M内存,还是没啥鸭梨啊...如果你感兴趣可以做个试验,内存很少的时候,你打开一个大游戏,然后退出,你会发现。。。如此这般。。。
E. 在Android开发中,有哪些好的内存优化方式
1. 使用更加轻量的数据结构
例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效,在于他们避免了对key与value的自动装箱(autoboxing),并且避免了装箱后的解箱。
2. 避免在Android里面使用Enum
Android官方培训课程提到过“Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.”,具体原理请参考《Android性能优化典范(三)》,所以请避免在Android里面使用到枚举。
3. 减小Bitmap对象的内存占用
Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用可谓是重中之重,,通常来说有以下2个措施:
inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异
4.Bitmap对象的复用
缩小Bitmap的同时,也需要提高BitMap对象的复用率,避免频繁创建BitMap对象,复用的方法有以下2个措施
LRUCache : “最近最少使用算法”在Android中有极其普遍的应用。ListView与GridView等显示大量图片的控件里,就是使用LRU的机制来缓存处理好的Bitmap,把近期最少使用的数据从缓存中移除,保留使用最频繁的数据,
inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放Bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小
4. 使用更小的图片
在涉及给到资源图片时,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用更小的图片。尽量使用更小的图片不仅可以减少内存的使用,还能避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图时会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM。
5.StringBuilder
在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”。
6.避免在onDraw方法里面执行对象的创建
类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。
7. 避免对象的内存泄露
类的静态变量持有大数据对象
静态变量长期维持到大数据对象的引用,阻止垃圾回收。
非静态内部类存在静态实例
非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。
资源对象未关闭
资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们, 以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。 如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。
解决办法: 比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭), 如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。 因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null. 在我们的程序退出时一定要确保我们的资源性对象已经关闭。 程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小, 对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险,记得try catch后,在finally方法中关闭连接
Handler内存泄漏
Handler作为内部类存在于Activity中,但是Handler生命周期与Activity生命周期往往并不是相同的,比如当Handler对象有Message在排队,则无法释放,进而导致本该释放的Acitivity也没有办法进行回收。
更目录建文件夹
音乐用MUSIC
照片用DCIM
图片用IMAGE
下载用
DOWNLOAD
视频和照片可以放一起
大型游戏数据包一般放在ANDROID的DATA里
有些得单独建立别的比如GAMELOFT的大游戏
G. android系统严格规定了每个应用所能分配的最大的内存为多少
Android应用程序的默认最大内存值为16M,不同的手机版本和型号有所不同(我的三星galaxy s3的是256M)
Android应用程序的默认最大内存值
有些应用程序可能会出现内存溢出,譬如:
ERROR/AndroidRuntime(264): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
除了要检查修正代码之外,还可以考虑修改Android应用程序的默认最大内存值。
H. 如何调整安卓data,system和cache分区
让我们开始在Android手机和平板电脑的标准的内部存储器分区的列表。这些是: / boot目录 /系统 = /system /恢复 = /recovery /数据 = /data /缓存 =/cache /杂项 =/misc 此外,还有的SD卡分区。 / SD卡 =/sdcard / SD-EXT /boot 需要注意的是/ SD卡被发现在所有的Android设备,其余的是目前只有在选择设备。现在,让我们来看看在每个分区的目的和内容。 / boot目录 这是分区,使手机开机,正如其名称所暗示的。它包括引导程序和内核。如果没有这个分区,该设备将根本就没有能够启动。擦拭从恢复分区只应在绝对必要时,一旦完成,该设备必须重新启动,然后再安装一个新的,它可以通过安装ROM,其中包括一个/ boot分区。 /系统 此分区基本上包含了整个操作系统的内核和引导以外。这包括了Android用户界面,以及所有的系统预安装在设备上的应用程序来。擦这个分区将删除从设备的Android不使其无法启动的情况下,你仍然可以把手机恢复或bootloader模式,安装一个新的ROM。 /恢复 恢复分区可以被视为一个可供选择的引导分区,让你进入恢复控制台启动设备,进行先进的恢复和维护操作。要了解更多有关这个分区及其内容,请参阅“关于Android的恢复我们的指南,ClockworkMod恢复”部分。 /数据 也称为用户数据,数据分区包含用户的数据 - 这是在您的联系人,邮件,设置和已安装的应用程序,你去。擦这个分区基本上是在您的设备上执行出厂重设,恢复它的方式是当你第一次启动时,它的方式,这是最后一次正式的或自定义ROM安装后的。当您执行擦除数据/工厂复位恢复,这是分区,你是擦。 /缓存 这是Android的存储经常访问的数据和应用程序组件所在的分区。擦拭缓存不会影响你的个人资料,但根本摆脱现有的数据,这将会自动重建,如您继续使用该设备。 /杂项 此分区包含各种系统设置,在形式的ON / OFF开关。 USB配置和某些硬件设置等,这些设置可能包括CID(承运人或地区ID),这是一个重要的分区,如果是损坏或丢失的,一些设备的功能将无法正常工作。 / SD卡 这是不是内部存储器的设备,而是在SD卡上的分区。在使用方面,这是您的存储空间,使用您认为合适的存储媒体,文件,光盘等就可以了。擦拭它是完全安全的,只要你备份所有的数据,你需要它,你的电脑。尽管一些用户安装的应用程序保存在SD卡上的数据和设置,抹这个分区将让你失去所有的数据。 在内部和外部SD卡 - 三星Galaxy S和几片 - 总是用来指到内部SD卡/ SD卡分区的设备,如设备。对于外部SD卡 - 如果有的话 - 替代分区时,器件的不同。在三星的Galaxy S系列设备的情况下,它是/ SD卡/ SD,而在许多其他设备,它是/ sdcard2,。 / SD卡不同,没有系统或应用程序的任何数据自动存储在这个外部SD卡,一切都存在于它已添加的用户。您可以放心地擦拭后,你需要保存的任何数据备份。 / SD-EXT 这不是一个标准的Android分区,但已成为流行的自定义ROM的场景。它基本上是你的SD卡/ data分区时使用的ROM中有特殊的功能,称为APP2SD +或data2ext启用的,作为一个附加的分区上。这是特别有用的设备上很少有内部内存分配的/ data分区。因此,用户要安装更多的程序比内存允许,可以使这个分区,并使用一个自定义的ROM支持此功能,安装自己的应用程序,以获得额外的存储。 ,擦这个分区在本质上是相同的擦/ data分区 - 你失去你的联系人,短信,市场应用和设置。
I. 如何突破24M内存的限制,为Android程序分配到更多内存
一个Android的应用最多使用16M的内存,如果要突破这个限制,则要使用c/c++编写JNI,即直接调用底层的函数来处理.linux也是用c/c++来编写的,因此有非常非常多的函数库可以调用.
J. android为什么要内存优化
android为什么要内存优化是为了防止Android的内存溢出
Android的内存溢出是如何发生的?
Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此所能利用的内存空间是有限的。如果内存占用超过了一定的水平就会出现OutOfMemory的错误。
为什么会出现内存不够用的情况呢?原因主要有两个:由于程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。
保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。
在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的可怜。这样就需要在开发过程中要时刻注意。不要因为自己的代码问题而造成OOM错误。
Android的优化方式
Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。
那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的原理。Java将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么认为这个(这些)对象不再被引用,可以被GC回收