内存信息查看

Android手机的内存大小信息存放在手机系统的 /proc/meminfo 文件里面,我们可以通过读取这个文件来获取内存信息。

使用 cmd 命令行打开终端或直接在 Android Studio 中使用命令终端,运行 adb 命令可以看到文件详细内容如下所示:

C:\Users\YZJ>adb shell
sagit:/ $ cat /proc/meminfo
MemTotal:        5861796 kB
MemFree:           86060 kB
MemAvailable:    2236400 kB
Buffers:           83668 kB
Cached:          2069156 kB
SwapCached:        13432 kB
Active:          2440572 kB
Inactive:        1487968 kB
Active(anon):    1437024 kB
Inactive(anon):   471244 kB
Active(file):    1003548 kB
Inactive(file):  1016724 kB
Unevictable:      130564 kB
Mlocked:          130564 kB
SwapTotal:       2621436 kB
SwapFree:        1846508 kB
Dirty:               152 kB
Writeback:             0 kB
AnonPages:       1899920 kB
Mapped:           661984 kB
Shmem:              2520 kB
Slab:             408472 kB
SReclaimable:     161756 kB
SUnreclaim:       246716 kB
KernelStack:       70960 kB
PageTables:        95204 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5552332 kB
Committed_AS:   104783600 kB
VmallocTotal:   258867136 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
CmaTotal:         163840 kB
CmaFree:             128 kB

下面介绍常见的几项:

(1)MemTotal: 所有可用RAM大小。(即物理内存减去一些预留位和内核的二进制代码大小)
(2)MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。
(3)Buffers: 用来给文件做缓冲大小。
(4)Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。
(5)SwapCached: 被高速缓冲存储器(cache memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。
(6)Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。
(7)Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。
(8)SwapTotal: 交换空间的总大小。
(9)SwapFree: 未被使用交换空间的大小。
(10)Dirty: 等待被写回到磁盘的内存大小。
(11)Writeback: 正在被写回到磁盘的内存大小。
(12)AnonPages: 未映射页的内存大小。
(13)Mapped: 设备和文件等映射的大小。
(14)Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
(15)SReclaimable: 可收回Slab的大小。
(16)SUnreclaim: 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
(17)PageTables: 管理内存分页页面的索引表的大小。
(18)NFS_Unstable: 不稳定页表的大小。

获取内存信息方法

获取 android 当前可用运行内存大小

public static String getAvailMemory(Context context) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();am.getMemoryInfo(mi);// mi.availMem; 当前系统的可用内存return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化}

获取android总运行内存大小

 public static String getTotalMemory(Context context) {String str1 = "/proc/meminfo";// 系统内存信息文件String str2;String[] arrayOfString;long initial_memory = 0;try {FileReader localFileReader = new FileReader(str1);BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小arrayOfString = str2.split("\\s+");for (String num : arrayOfString) {Log.i(str2, num + "\t");}// 获得系统总内存,单位是KBint i = Integer.valueOf(arrayOfString[1]).intValue();//int值乘以1024转换为long类型initial_memory = new Long((long)i*1024);localBufferedReader.close();} catch (IOException e) {}return Formatter.formatFileSize(context, initial_memory);// Byte转换为KB或者MB,内存大小规格化}

实现内存分配的方法

内存分配的方法,使用ndk开发,引用realloc、malloc、calloc三个方法实现内存的分配。

ANSI C说明了三个用于存储空间动态分配的函数:
(1) malloc 分配指定字节数的存储区。此存储区中的初始值不确定 。
(2) calloc 为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0 。
(3) realloc 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。

1、malloc


原型 : extern void *malloc(unsigned int num_bytes);

何时使用:当需要在内存的动态存储区中分配一块长度为num_bytes字节的连续区域时。参数num_bytes为需要的内存空间的长度,返回该区域的地址。

特点:

malloc在动态分配完内存后不对分配的内存空间初始化,里边数据是随机的垃圾数据。

实现原理:

它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿链表寻找一个大到足以满足用户请求所需要的内存 块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

2、calloc


原型:void *calloc(size_t n, size_t size);

何时使用:当需要在内存的动态存储区中分配n个长度为size_t size字节的连续空间时。如果分配成功,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL

特点:

calloc在动态分配完内存后,自动初始化该内存空间为零

3、realloc


原型:extern void *realloc(void *mem_address, unsigned int newsize);

何时使用:当需要在已经被(malloc(), calloc(),realloc())分配的空间的基础上重新分配空间时。参数mem_address为原有的空间地址,newsize是重新申请的地址空间。

特点:

  • ①传递给realloc的指针必须是先前通过malloc(), calloc(),realloc()分配的。
  • ②如果realloc需要的内存小于原来的内存大小,会导致数据丢失;如果原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存realloc还是返回原来内存的地址;如果原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free,realloc返回新内存的地址。
  • ③如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL。而原来的内存块保持不变。
  • ④如果newsize大小为0,那么释放mem_address指向的内存,并返回NULL
  • ⑤如果mem_addressNULL,则realloc()malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。


您的关注和点赞是我分享的动力,如有帮助请勿吝啬!ヽ( ̄▽ ̄)ノ



Android内存(RAM)大小信息查看、获取方法和内存分配方法相关推荐

  1. android系统通过图片绝对路径获取URI的三种方法

    老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...

  2. android 获取wifi的ip地址吗,Android开发实现在Wifi下获取本地IP地址的方法

    本文实例讲述了Android开发实现在Wifi下获取本地IP地址的方法.分享给大家供大家参考,具体如下: 代码核心介绍: WifiManager类提供了对设备Wifi功能的管理,包括Wifi开关的打开 ...

  3. android 获得ram大小,Android中获取(RAM)总运存大小跟可用运存大小

    Android中获取(RAM)总运存大小和可用运存大小 //获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可 ...

  4. android 获得ram大小,Android中获取(RAM)总运存大小和可用运存大小

    //获取可用运存大小 private long getAvailMemory(Context context){ // 获取android当前可用内存大小 ActivityManager am = ( ...

  5. 如何获知计算机ram大小,如何查看电脑的运行内存大小(如何查看电脑的内存是多少)...

    现在电脑基本都是普及了,但还有好一部分小伙伴不知道电脑的内存在哪里查看的.有一次,我问某个小伙伴,你的电脑内存是多少?他脱口而出,1T.所以,我就特意写了这一篇教程.希望各位小伙伴都可以正确认识和分辨 ...

  6. java中比较两个文件的大小_Java实现获取文件大小的几种方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.i ...

  7. Linux 进程内 全局看见,Android获得全局进程信息以及进程使用的内存情况

    Android获得全部进程信息,并获得该进程使用的内存情况. package linuxidc.process; import java.util.List; import android.os.Bu ...

  8. java 内存情况_Java代码中获取运行时内存情况

    在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...

  9. 如何查看服务器内存及cpu信息,查看服务器当前内存cpu信息

    查看服务器当前内存cpu信息 内容精选 换一换 设备实时状态查询是检测设备在运行过程中的状态信息.用户可任选以下指令之一查看设备实时状态查询命令的可用参数.ascend-dmi -i -hascend ...

最新文章

  1. 【Tensorflow-Error】CUDA_ERROR_OUT_OF_MEMORY: out of memory
  2. 每个程序员都可能犯过的10个错误
  3. 二维数组的遍历之查漏补缺
  4. 2021大二实训part01
  5. android渐变布局,关于Android的径向渐变高级编程的实现
  6. Spring源码之bean的加载(二)获取单例bean
  7. pytest-Mark数据驱动
  8. webservice wsimport 报错
  9. 举办2021创业者线下沙龙心得与感悟
  10. win7万能声卡驱动_驱动精灵万能网卡版下载-驱动精灵万能网卡版免费下载
  11. PHP验证码类庫,php验证码类
  12. ftp匿名登录 漏洞复现
  13. 思科交换机路由器 连接配置步骤
  14. python的staticmethod,classmethod和装饰器以及闭包的爱恨情仇
  15. Python Diango学习之路
  16. c语言 安装初始化错误,错误:初始化元素不是常量(c语言)(Error: Initializer Element is not constant (c language))...
  17. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(25):幂级数(补充知识)
  18. 在vue页面中使用伪元素进行 气泡框创建|选中效果自定义|滚动条自定义
  19. 流程图头脑风暴类软件
  20. miniui图片附件上传回显

热门文章

  1. three.js之材质
  2. 学人工智能10本必看书!AI经典书籍介绍
  3. Java2Word 使用_如何用Java2Word改写已有word表格中的数据
  4. 关于报错:No module named ‘paddle.utils.plot
  5. SQL Server2012数据库还原以及单用户改为多用户
  6. docker集群(3):集群常用命令
  7. L1-039 古风排版 python实现
  8. Linux-基础命令练习
  9. 请写一段代码 把cv2 imshow窗口可以保存为动图
  10. android中图片格式png,jpg和webp