1.Android 运行时的内存分配:http://www.jianshu.com/p/9546d21376ed#
物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(16M,32M不定),这块内存空间会映射到RAM上某个区域。然后这个Android程序就会运行在这块空间上。Java里会将这块空间分成Stack栈内存和Heap堆内存。stack里存放对象的引用,heap里存放实际对象数据。
2.内存泄露 http://jiajixin.cn/2015/01/06/memory_leak/
一些对象有着有限的生命周期。当这些对象所要做的事情完成了,我们希望他们会被回收掉。但是如果有一系列对这个对象的引用,那么在我们期待这个对象生命周期结束的时候被收回的时候,它是不会被回收的。它还会占用内存,这就造成了内存泄露。持续累加,内存很快被耗尽。
Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。
3.android 内存管理
http://android-performance.com/android/2014/02/17/android-manage-memory.html
http://hukai.me/android-performance-oom/
4.摄像头数据采集内存占用(??)
图像占用空间的大小计算:
大小=分辨率*位深/8
分辨率=宽*高(如:1024*768,640*480)
位深:如24位,16位,8位
/8计算的是字节数。
例如:
一幅图像分辨率:1024*768,24位,则其大小计算如下:
大小=1024*7688*24/8=2359296byte=2304KB
如果将摄像头的分辨率调到640×480,捕捉到的图片每张 大小约为50kb左右,每秒30帧,那么摄像头传输视频所需的速度为50×30/s=1500kbps=1.5Mbps。而在实际生活中,人们一般用于网络视频聊天时的分辨率为320×240甚至更低,传输的帧数为每秒24帧。
进程和线程
Android系统会尽可能长的保持应用程序进程的运行,但总会有需要清除旧的进程来释放资源以满足新或是重要的进程的运行。为了决定哪些进程可以杀死,哪些进程需要保留,系统根据运行在其中的应用程序组件和这些组件的状态,将这些进程分配到“重要性层次表”中。具有最低重要性的进程首先被杀死,次重要性的进程为其次等等直到系统恢复所需的资源。
“重要性层次表”可以分为五个层次,下面列表给出了不同类型的进程的重要性等级(最重要的排在前面):
1.前台进程
这种进程是当前用户所需要的。一个进程被认为是前台进程需满足下面条件之一:
·本进程中有Activity是当前和用户有交互的Activity(该Activity的onResume()已调用)。
·本进程中有Service和当前用户有交互Activity的绑定。
·本进程中有在前台运行的Service—该Service调用过startForeground()。
·本进程中有Service正在执行某个生命周期回调函数(onCreate(),onStart()或onDestroy())。
·本进程中的某个BroadcastReceiver正在执行onReceive()方法。
2.可见进程
这种进程虽然不含有任何在前台运行的组件,但会影响当前显示给用户屏幕上的内容,一个进程中满足下面两个条件之一时被认为是个可见进程:
·本进程含有一个虽然不在前台但却部分可见的Activity(该Activity的onPause()被调用)。可能发生的情形是前台Activity显示一对话框,此时之前的Activity变为部分可见。
·本进程含有绑定到可见Activity的Service。
3.服务进程
该进程运行了某个使用startService()启动的Service,但不属于以上两种情况。尽管此服务进程不直接和用户可以看到的任何部分有关联,但它会运行一些用户关心的事情(比如在后台播放音乐或者通过网络下载文件)。因此Android系统会尽量让它们运行直到系统资源低到无法满足前台和可见进程的运行。
4.后台进程
该进程运行一些目前用户不可见的Activity(该Activity的onStop()已被调用),该进程对用户体验无直接的影响,系统中资源低时为保证前台,可见或服务进程运行时可以随时杀死该进程。通常系统中有很多进程在后台运行,这些进程保存在LRU(最近使用过)列表中以保证用户最后看到的进程最后被杀死。如果一个Activity正确实现了它的生命周期函数,并保存了它的状态。杀死运行该Activity的进程对用户来说在视觉上不会有什么影响,这是因为之后用户回到该Activity时,该Activity能够正确恢复之前屏幕上的状态。
5.空进程
该进程不运行任何活动的应用程序组件。保持这种进程运行的唯一原因是由于缓存,以缩短下次运行某个程序组件时的启动时间。系统会为了进程缓存和内核缓存之间的平衡经常会清除空进程。
另一种解释(易于理解)
Android进程种类
1.前台进程(foreground)Android内存管理机制详解
目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer,Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。
2.可见进程(visible)
可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)
3.桌面进程(home app)
即launcher,保证在多任务切换之后,可以快速返回到home界面而不需重新加载launcher
4.次要服务(secondary server)
目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
5.后台进程(hidden)
即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点
6.内容供应节点(content provider)
没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权
7.空进程(empty)
没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。