http://blog.csdn.net/xpwang168/article/details/6982453
我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是
native+dalvik 不能超过最大限制。
1.单个app 内存限制大小
- ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- activityManager.getMemoryClass();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityManager.getMemoryClass();
2."/proc/meminfo" 系统内存信息文件【整个系统的内存情况】
3.ActivityManager.MemoryInfo【整个系统】
availMem 剩余内存
threshold 临界值 【超过次值就开始杀死后台服务和没有关联的进程】
lowMemory 低内存状态
4.android.os.Debug
getNativeHeapFreeSize()
getNativeHeapAllocatedSize()
getNativeHeapSize()
5.android.os.Debug.MemoryInfo【当前进程的内存情况】
6.Runtime
getExternalBytesAllocated() 应该是外部分配的内存Native内存
8.GC_EXTERNAL_ALLOC freed
与 GC_EXPLICIT freed 是什么?
系统GC释放的内存提示
45656 bytes in 50ms
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms
EXPLICIT:Free的内存是VM中java使用的内存
即 heap mem
例如 Bitmap 和一些 Cursor
在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。
例如上边的例子
explicit 3411K/6663K
external 24870K/26260K
如果这时需要创建一个2M的
所以现在我们要检查我们的native内存的使用情况来避免OOM。
三、通过Android系统提供的Runtime类,执行adb 命令(top,procrank,ps...等命令)查询
内存耗用:VSS/RSS/PSS/USS
Terms
• VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
• RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
• PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
• USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS