free -m 查看内存简介

本文深入解析Linux系统中内存管理的概念及原理,通过free-m命令展示内存使用情况,包括物理内存、已用内存、空闲内存等核心指标,并详细解释buffers与cached的作用。

free -m 查看内存简介

                               linux 内存简介

我们在linux用free -m 查看linux内存使用情况。-m 参数就是用 M显示内容使用情况。这时回显会出现几个结果。

Mem 是 内存的使用情况总览表。

totel:机器总的物理内存 单位为:M

used:用掉的内存。这里是从系统的层面看到的。

free:空闲的物理内存。这个也是从系统的层面看到的。

 

物理内存=系统看到的用掉的内存+系统看到空闲的内存。

我们平时看内存的使用也就看这些。

 

shared:多个进程共享的内存总和,当前废弃不用。

buffers:系统分配但未被使用的buffers 数量。

cached:  系统分配但未被使用的cached数量。

 

先给出公式:

total = used + free ;total = |+ buffers/cache|+|- buffers/cache|   这里指是绝对值;

 

给程序预留的内存空间 = buffers+cached 。

内存使用上来说,linux 系统会把物理内存占用一部分,也就是used的大小,然后在这里内存里面分一部分来供所有的程序实际使用。就如同现在有个10亩地地的大田(总内存),我买个5亩准备盖房子,我声明我圈到院子里的都是我的了,并且我盖上了围墙,我圈起来,这5亩地就是used的大小,;别管我咋使用了,然后我拿出1亩地来盖房子。盖房子的这些地就是系统程序实际使用的,这部分就是:- buffers/cache,然后我还会预留

出来一部分在房子外开辟临时停车棚、临时菜园等之类的,buffers和cached就是这些除了房子之外围墙之内的所有的可以供我临时使用所占用地了,,buffers和cached可以理解为 5亩地-盖房子的1亩  剩下的都是可以供我使用的。所以看来,我占用的就是5亩地。但实际上只有1亩地用于住房,剩下的地就是供我随意支配使用了。

 

所以得出来:我实际占用的地=用于住房的地(- buffers/cache)= 围墙内的5亩地(used)-可以供我临时使用的地 (buffers+cached)

 而这个- buffers/cache  不是仅仅是系统占用的,是系统和系统中的程序共同占用的实际用到的内存空间!           

 

-/+ buffers/cache:可以分为两部分 + buffers/cache;- buffers/cache。这两部分的关系是:

总的物理内存=|+ buffers/cache|+|- buffers/cache|;总的物理内存=两个buffers/cache的物理值相加的和。

 

这个是从程序的角度上来看的。

- buffers/cache:程序角度上看已经使用的内存数,这才是程序实实在在用掉的内存数。

+ buffers/cache:程序角度上看未使用、可用的内存数。

 

实际上来说,程序占用的真正内存就是:- buffers/cache 的数值。

所以看系统,真正已经用的内存数:used-(buffers+cached)的值。

            真正未用到的内存数:free+buffers+cached  的值。

<think>在Android shell环境中,我们通常使用`free`命令来查看内存使用情况。但是,标准的Android shell(如adb shell)可能没有完整的`free`命令,或者其参数可能有限。在Android中,我们通常使用`cat /proc/meminfo`来查看内存信息,或者使用`procrank`、`dumpsys meminfo`等命令。 但是,如果您的Android设备上确实有`free`命令(例如,通过BusyBox安装),那么: - `free -m`:以MB为单位显示内存使用情况。 - `free -h`:以人类可读的格式(自动转换单位)显示内存使用情况。 然而,在标准的Android系统中,通常没有`free`命令。因此,我们需要使用其他方法来获取内存信息。 ### 替代方案:解析`/proc/meminfo` 我们可以通过读取`/proc/meminfo`文件,然后解析其中的值,并转换为MB或人类可读的格式。 以下是一个示例脚本,用于模拟`free -m`和`free -h`的输出: ```sh #!/system/bin/sh # 模拟 free -m 的输出 free_m() { # 读取 meminfo mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}') mem_free=$(grep MemFree /proc/meminfo | awk '{print $2}') mem_available=$(grep MemAvailable /proc/meminfo | awk '{print $2}') buffers=$(grep Buffers /proc/meminfo | awk '{print $2}') cached=$(grep -w Cached /proc/meminfo | awk '{print $2}') swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}') swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}') # 转换为MB(除以1024) mem_total_m=$((mem_total / 1024)) mem_free_m=$((mem_free / 1024)) mem_available_m=$((mem_available / 1024)) buffers_m=$((buffers / 1024)) cached_m=$((cached / 1024)) swap_total_m=$((swap_total / 1024)) swap_free_m=$((swap_free / 1024)) # 计算已用内存:total - free - buffers - cached mem_used_m=$((mem_total_m - mem_free_m - buffers_m - cached_m)) # 输出 printf " total used free shared buffers cached\n" printf "Mem: %-5s %-5s %-5s %-5s %-5s %-5s\n" \ "$mem_total_m" "$mem_used_m" "$mem_free_m" "0" "$buffers_m" "$cached_m" printf "Swap: %-5s %-5s %-5s\n" \ "$swap_total_m" "$((swap_total_m - swap_free_m))" "$swap_free_m" } # 模拟 free -h 的输出 free_h() { # 读取 meminfo mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}') mem_free=$(grep MemFree /proc/meminfo | awk '{print $2}') mem_available=$(grep MemAvailable /proc/meminfo | awk '{print $2}') buffers=$(grep Buffers /proc/meminfo | awk '{print $2}') cached=$(grep -w Cached /proc/meminfo | awk '{print $2}') swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}') swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}') # 转换为人类可读格式 to_human() { local value=$1 if [ $value -ge 1048576 ]; then printf "%.1fG" $(echo "scale=1; $value/1048576" | bc) elif [ $value -ge 1024 ]; then printf "%.1fM" $(echo "scale=1; $value/1024" | bc) else printf "%dK" $value fi } mem_total_h=$(to_human $((mem_total * 1024))) mem_used_h=$(to_human $(( (mem_total - mem_free - buffers - cached) * 1024 ))) mem_free_h=$(to_human $((mem_free * 1024))) buffers_h=$(to_human $((buffers * 1024))) cached_h=$(to_human $((cached * 1024))) swap_total_h=$(to_human $((swap_total * 1024))) swap_used_h=$(to_human $(( (swap_total - swap_free) * 1024 ))) swap_free_h=$(to_human $((swap_free * 1024))) # 输出 printf " total used free shared buffers cached\n" printf "Mem: %-5s %-5s %-5s %-5s %-5s %-5s\n" \ "$mem_total_h" "$mem_used_h" "$mem_free_h" "0" "$buffers_h" "$cached_h" printf "Swap: %-5s %-5s %-5s\n" \ "$swap_total_h" "$swap_used_h" "$swap_free_h" } # 根据参数调用函数 case "$1" in -m) free_m ;; -h) free_h ;; *) echo "Usage: $0 [-m|-h]" exit 1 ;; esac ``` ### 代码解释: 1. **`free_m` 函数**: - 读取`/proc/meminfo`中的相关字段(MemTotal, MemFree, MemAvailable, Buffers, Cached, SwapTotal, SwapFree)。 - 将这些值从KB转换为MB(除以1024)。 - 计算已用内存:`used = total - free - buffers - cached`。 - 按照`free -m`的格式输出。 2. **`free_h` 函数**: - 同样读取`/proc/meminfo`中的字段。 - 定义了一个`to_human`函数,将KB转换为人类可读的格式(自动转换为K、M、G)。 - 计算已用内存(同`free_m`)。 - 按照`free -h`的格式输出。 3. **参数处理**: - 脚本接受一个参数:`-m` 或 `-h`。 - 调用相应的函数。 ### 注意事项: 1. 该脚本依赖于`/proc/meminfo`,在Android设备上通常可用。 2. 需要设备上有`awk`和`bc`命令(在Android上,可以通过BusyBox提供)。 3. 如果设备没有`bc`,可以使用`awk`进行浮点运算,或者使用整数运算然后进行字符串处理。 ### 使用示例: ```sh # 赋予执行权限 chmod +x free.sh # 模拟 free -m ./free.sh -m # 模拟 free -h ./free.sh -h ``` ### 替代方案:使用`dumpsys meminfo` 在Android中,还可以使用`dumpsys meminfo`来获取内存信息,但它输出的格式与`free`不同。如果您需要的是整个系统的内存概览,上面的脚本已经足够。如果您需要每个进程的内存信息,则应该使用`dumpsys meminfo`。 §§相关问题§§: 1. 在Android设备上,如何通过`dumpsys meminfo`获取特定进程的内存使用情况? 2. 如果设备没有安装BusyBox,如何在不使用`awk`和`bc`的情况下解析`/proc/meminfo`? 3. 如何修改上述脚本以实时监控内存变化(例如,每秒更新一次)? 4. 在Android开发中,有哪些常用的内存分析工具(如MAT、Perfetto等)及其使用方法?</think># `free -h` 和 `free -m` 命令详解 `free` 是 Linux 系统中用于查看内存使用情况的常用命令,而 `-h` 和 `-m` 是它的两个常用选项。这两个选项都用于控制内存单位的显示方式,但有不同的用途和输出格式。 ## `free -m`:以 MB 为单位显示内存使用 `free -m` 以兆字节(MB)为单位显示内存使用情况,适用于需要精确数值的场景: ```bash free -m ``` ### 典型输出: ``` total used free shared buff/cache available Mem: 7842 1024 2034 123 4783 6543 Swap: 2047 512 1535 ``` ### 输出字段解释: - **total**:总物理内存大小(MB) - **used**:已使用的内存(MB) - **free**:空闲内存(MB) - **shared**:共享内存(MB) - **buff/cache**:缓存和缓冲区使用的内存(MB) - **available**:可用内存(MB) - **Swap**:交换空间信息 ## `free -h`:以人类可读格式显示内存 `free -h` 以更友好的格式显示内存大小,自动选择合适的单位(KB、MB、GB): ```bash free -h ``` ### 典型输出: ``` total used free shared buff/cache available Mem: 7.6G 1.0G 2.0G 123M 4.7G 6.4G Swap: 2.0G 512M 1.5G ``` ### 特点: - 自动转换单位(KB、MB、GB) - 更易读的数字格式 - 适合快速查看系统内存概览 ## 两种格式的对比 | 特性 | `free -m` | `free -h` | |------|-----------|-----------| | 单位 | 固定为 MB | 自动选择最佳单位 | | 精度 | 精确到整数 MB | 精确到小数点后一位 | | 可读性 | 较低(需要自行转换) | 较高(自动转换) | | 适用场景 | 脚本处理、精确计算 | 快速查看、日常使用 | | 输出示例 | `Mem: 7842 1024 2034` | `Mem: 7.6G 1.0G 2.0G` | ## 实际应用场景 ### 1. 脚本中处理内存数据(使用 `free -m`) 在脚本中处理内存数据时,使用 `free -m` 可以获取数值型数据,便于计算: ```bash #!/bin/bash # 获取内存使用情况 mem_info=$(free -m | awk '/Mem:/{print $2,$3,$4}') # 解析数据 total=$(echo $mem_info | awk '{print $1}') used=$(echo $mem_info | awk '{print $2}') free=$(echo $mem_info | awk '{print $3}') # 计算使用率 usage=$((used * 100 / total)) # 输出结果 echo "内存使用报告:" echo "总内存: ${total}MB" echo "已使用: ${used}MB" echo "空闲内存: ${free}MB" echo "使用率: ${usage}%" ``` ### 2. 日常系统监控(使用 `free -h`) 对于日常系统监控和故障排查,`free -h` 提供更直观的信息: ```bash #!/bin/bash # 获取人类可读的内存信息 echo "当前内存使用情况:" free -h # 检查内存使用率 threshold=90 usage=$(free | awk '/Mem:/ {printf("%.0f"), $3/$2 * 100}') if [ $usage -ge $threshold ]; then echo "警告: 内存使用率超过 ${threshold}% (当前: ${usage}%)" # 添加警报逻辑... fi ``` ## 在 Android 设备上的注意事项 在 Android shell 环境中,标准的 `free` 命令可能不可用。可以使用以下替代方法: ### 1. 使用 `procrank` 命令(需要 root) ```bash procrank ``` ### 2. 解析 `/proc/meminfo` ```bash #!/system/bin/sh # 获取内存信息 mem_total=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}') mem_free=$(cat /proc/meminfo | grep MemFree | awk '{print $2}') mem_available=$(cat /proc/meminfo | grep MemAvailable | awk '{print $2}') # 转换为 MB mem_total_mb=$((mem_total / 1024)) mem_free_mb=$((mem_free / 1024)) mem_available_mb=$((mem_available / 1024)) # 输出结果 echo "内存使用情况:" echo "总内存: ${mem_total_mb}MB" echo "空闲内存: ${mem_free_mb}MB" echo "可用内存: ${mem_available_mb}MB" ``` ### 3. 使用 `dumpsys meminfo` ```bash dumpsys meminfo ``` ## 总结 `free -m` 和 `free -h` 都是 Linux 系统中查看内存使用的重要工具: - **`free -m`** 适合脚本处理和精确计算 - **`free -h`** 适合日常使用和快速查看 - 在 Android 环境中,可以使用替代命令如 `procrank` 或解析 `/proc/meminfo` 对于需要精确数值的场景(如脚本处理),推荐使用 `free -m`;对于日常查看和快速诊断,`free -h` 是更好的选择。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值