C和C++程序上的内存分配释放函数如下:
cat /proc/pids/maps命令
cat /proc/pid/status命令
====================================================================================
① 首先尝试申请一个128MB空间,观察maps和status文件的变化。
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
//命令 cat /proc/pid/maps
void maps(char s[8]){
char str[100] = {"cat /proc/"};
strcat(str,s);
char l[8] = {"/maps"};
strcat(str,l);
cout<<str<<endl;
system(str);
}
//命令 cat /proc/pid/status
void status(char s[8]){
char str[100] = {"cat /proc/"};
strcat(str,s);
char l[8] = {"/status"};
strcat(str,l);
cout<<str<<endl;
system(str);
}
int main(){
int *p[8];
char s[8];
int pid = getpid();
sprintf(s,"%d",pid);
cout<<"分配内存前的maps和status情况"<<endl;
maps(s);
status(s);
cout<<"先分配1个128MB的内存"<<endl;
//一个int占4个字节
//128MB = 128 * 1024 KB = 131072 KB
//128MB = 128 * 1024 * 1024 字节(byte) = 134217728 Byte
//int数组长度为 128 * 1024 * 1024 / 4
p[1] = new int[33554432];
maps(s);
status(s);
delete[] p[1];
return 0;
}
创建128MB内存前后程序执行命令cat /proc/pid/maps,发现maps信息中有一个地址段发生变化。
b7848000 (16) – af847000 (16) = 134221824(10) =128MB + 4KB
创建128MB内存程序前后执行命令cat/proc/pid/status,发现status信息有变化
VmPeak进程地址空间大小增加了131016KB = 128MB– 56KB
VmSize进程虚拟地址空间的大小增加了131076KB= 128MB + 4KB
VmHWM程序得到分配到物理内存的峰值,文件内存映射和匿名内存映射的大小增加了36KB
VmRSS应用程序正在使用的物理内存的大小增加了36KB
VmData程序数据段的大小增加了131076KB= 128MB + 4KB
VmPTE该进程的页表的大小增加了4KB
voluntary_ctxt_swicthes进程主动切换的次数增加了2次
② 连续申请分配六个128MB空间(记为1~6号),然后释放第2、3、5号的128MB空间。
<span style="font-size:12px;">#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
//命令 cat /proc/pid/maps
void maps(char s[8]){
char str[100] = {"cat /proc/"};
strcat(str,s);
char l[8] = {"/maps"};
strcat(str,l);
cout<<str<<endl;
system(str);
}
//命令 cat /proc/pid/status
void status(char s[8]){
char str[100] = {"cat /proc/"};
strcat(str,s);
char l[8] = {"/status"};
strcat(str,l);
cout<<str<<endl;
system(str);
}
int main(){
int *p[8];
char s[8];
int pid = getpid();
sprintf(s,"%d",pid);
cout<<"分配内存前的maps和status情况"<<endl;
maps(s);
status(s);
cout<<"先分配6个128MB的内存,然后删除235号"<<endl;
//一个int占4个字节
//128MB = 128 * 1024 KB = 131072 KB
//128MB = 128 * 1024 * 1024 字节(byte) = 134217728 Byte
//int数组长度为 128 * 1024 * 1024 / 4
p[0] = new int[33554432];
p[1] = new int[33554432];
p[2] = new int[33554432];
p[3] = new int[33554432];
p[4] = new int[33554432];
p[5] = new int[33554432];
delete[] p[1];
delete[] p[2];
delete[] p[4];
maps(s);
status(s);
delete[] p[0];
delete[] p[3];
delete[] p[5];
return 0;
}</span><span style="font-size: 24px;">
</span>
6号128MB内存段(存在):
8f781000(16) – 87780000(16)= 134221824(10) B = 128MB + 4KB
5号128MB内存段(释放):
97782000(16) – 8f781000(16)= 134221824(10) B = 128MB + 4KB
4号128MB内存段(存在):
9f783000(16) – 97782000(16)= 134221824(10) B = 128MB + 4KB
3号和2号128MB