1,测试脚本
int main() { while (1) { char* addr[4]; int i = 1; int b; printf("请输入要分配的内存大小(以字节为GB,输入0退出):"); scanf("%d", &b); if (b == 0) { break; } for(i = 0; i < b; ++i) { addr[i] = (char*) malloc(MEM_SIZE); if(!addr[i]) { printf("执行 malloc 失败, 错误:%s\n",strerror(errno)); return -1; } printf("主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X%x\n", addr[i]); } for(i = 0; i < b; ++i) { printf("开始访问第 %d 块虚拟内存(每一块虚拟内存为 1 GB)\n", i + 1); memset(addr[i], 0, MEM_SIZE); } } return 0; }
2,编译
gcc -o memory_allocation m.c
3,测试
查看系统内存: 系统没有配置swap
[root@k8s01 shm]# free -h total used free shared buff/cache available Mem: 7.6G 597M 3.4G 3.4G 3.7G 3.4G Swap: 0B 0B 0B
执行编译后文件:
[root@k8s01 ~]# ./memory_allocation 请输入要分配的内存大小(以字节为GB,输入0退出):5 主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X59239010 主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X19238010 主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0Xd9237010 主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X99236010 主线程调用malloc后,申请1gb大小得内存,此内存起始地址:0X59235010 开始访问第 1 块虚拟内存(每一块虚拟内存为 1 GB) 开始访问第 2 块虚拟内存(每一块虚拟内存为 1 GB) 开始访问第 3 块虚拟内存(每一块虚拟内存为 1 GB) 开始访问第 4 块虚拟内存(每一块虚拟内存为 1 GB) Killed <<< OOM 进行被kill
检查系统日志:
Feb 21 09:54:36 k8s01 kernel: memory_allocati invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 Feb 21 09:54:36 k8s01 kernel: memory_allocati cpuset=/ mems_allowed=0 Feb 21 09:54:36 k8s01 kernel: CPU: 0 PID: 126526 Comm: memory_allocati Tainted: G ------------ T 3.10.0-693.el7.x86_64 #1 Feb 21 09:54:36 k8s01 kernel: Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020 Feb 21 09:54:36 k8s01 kernel: ffff880212a65ee0 000000005eacd9b4 ffff880212aa7a70 ffffffff816a3d91 Feb 21 09:54:36 k8s01 kernel: ffff880212aa7b00 ffffffff8169f186 ffffffff810e939c ffff880225ba8fa0
常用内存检查命令:
free
vmstat
sar -r/sar -W/sar -B
cat /proc/zoneinfo
cat /proc/buddyinfo
cat /proc/pagetypeinfo