Android获取内存信息

我们知道,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();

2."/proc/meminfo"  系统内存信息文件 【整个系统的内存情况】

Android获取手机总内存和可用内存

“/proc/meminfo”解析


3.ActivityManager.MemoryInfo【整个系统】

availMem         剩余内存

threshold         临界值 【超过次值就开始杀死后台服务和没有关联的进程】

lowMemory     低内存状态


4.android.os.Debug

getNativeHeapFreeSize()

getNativeHeapAllocatedSize()

getNativeHeapSize()


5.android.os.Debug.MemoryInfo【当前进程的内存情况】


6.Runtime


totalMemory()

freeMemory()

maxMemory()



7.VMRuntime


getTargetHeapUtilization()


getMinimumHeapSize()


getExternalBytesAllocated()   应该是外部分配的内存Native内存


8.GC_EXTERNAL_ALLOC freed 与 GC_EXPLICIT freed 是什么?

系统GC释放的内存提示


一般在LOG里面显示如下:
09-28 17:16:37.543: DEBUG/dalvikvm(21466): GC_EXTERNAL_ALLOC freed 390 objects / 45656 bytes in 50ms
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms

EXPLICITFree的内存是VM中java使用的内存 即 heap mem

EXTERNAFree的内存是VM中通过JNI的Native类中的malloc分配的内存 例如 Bitmap 和一些 Cursor

在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。

例如上边的例子

explicit 3411K/6663K

external 24870K/26260K

如果这时需要创建一个2M的

Bitmap,

Native现有内存26260-24870=1390K<2048k,因此他就会向Vm申请内存,虽然java空闲的内存是

6663-3411=3252>2048,但这部分内存Native是不能使用。

但是你现在去申请2M的Native内存,VM会告诉你无法分配的,因为现在已使用的内存已经接近峰值了32M(26260+6663=32923 ),所以现在就会成force close 报OOM。

所以现在我们要检查我们的native内存的使用情况来避免OOM。


ps:  http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813

三、通过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


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值