android程序运行时出现OutOfMemoryError


先上干货:

android程序运行时出现OOMOutOfMemoryError),即内存泄露,说明程序的内存管理出现问题,或者系统给程序分配的内存太低。如果程序难以优化,就可以修改系统分配给程序的内存值。这个值叫dalvik.vm.heapsize,在/system/build.prop文件里,大小一般是32m48m,可以改成64m或以上。写到 /system/build.prop 后重新开机才会生效。记得chmod 644 /system/build.prop ,不然会没办法开机。

关于build.prop:

Android系统中有一个类似Windows系统注册表的文件build.prop。这个文件内定义了系统初始(或永久)的一些参数属性、功能的开放等。通过调整/增加参数可以达到较调系统性能偏重点和附加功能开启的作用。在Android 2.22.34.04.14.24.34.4中虽然每一版都有自己独有的参数,但绝大部分都是通用的,且可以起到关键性作用的。

关于dalvikvm:

Dalvik虚拟机是Android程序的虚拟机,是AndroidJava程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

一个应用,一个虚拟机实例,一个进程!!!

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPCBinder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。

 不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它 虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。

关于dalvik堆内存分配

-dalvik.vm.heapstartsize           

堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢,但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发gc和堆调整的策略,会应用反应更慢。相反,这个值越大系统ram消耗越快,但是程序更流畅。

-dalvik.vm.heapgrowthlimit      

受控情况下的极限堆(仅仅针对dalvik堆,不包括native堆)大小,dvm heap是可增长的,但是正常情况下dvm heap的大小是不会超过dalvik.vm.heapgrowthlimit的值(非正常情况下面会详细说明)。这个值控制那些受控应用的极限堆大小,如果受控的应用dvm heap size超过该值,则将引发oomout of memory)。

-dalvik.vm.heapsize

不受控情况下的极限堆大小,这个就是堆的最大值。不管它是不是受控的。这个值会影响非受控应用的dalvikheap size。一旦dalvik heap size超过这个值,直接引发oom

用他们三者之间的关系做一个简单的比喻:分配dalvik heap就好像去食堂打饭,有人饭量大,要吃三碗,有人饭量小,连一碗都吃不完。食堂的策略是先打一碗,凑合吃,不够了自己再来加,一般人最多加到三碗。虎背熊腰的大汉可以加到五碗。超过五碗谁也不给了(食堂可能会破产)。

开始给一碗                                     对应dalvik.vm.heapstartsize

一般人可以加到三碗                      对应dalvik.vm.heapgrowthlimit

虎背熊腰的大汉最多能吃五碗              对应dalvik.vm.heapsize

android开发中,如果要使用大堆。需要在manifest中指定android:largeHeaptrue。这样dvm heap最大可达dalvik.vm.heapsize

Reference

http://bbs.meizu.cn/thread-3529493-1-1.html

http://my.eoe.cn/10407/archive/3856.html

http://blog.csdn.net/cqupt_chen/article/details/11068129

http://wenku.baidu.com/view/6811c82fcfc789eb172dc812.html

http://blog.csdn.net/andyxm/article/details/6126907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章