- 论坛徽章:
- 0
|
回复 10# spook
恩恩 对的 我的意思就是想说,定义了一个变量,那么系统就会在内存给它预留和对应大小的页面。
如果只是定义了,而没有使用,那么就会出现:
7ba5 11 work text data BSS heap s 2696 0 0 2696
f9ef8 12 work text data BSS heap s 2318 0 0 2318
这种一个段没用完,就使用另外一个段的情况 。
如果用MEMCPY或者MEMSET使用这部分内存,就发现,其实这里应该是系统预留了已经定义的变量的内存页。内存使用会变成:
7ba5 11 work text data BSS heap s 65536 0 0 65536
f9ef8 12 work text data BSS heap s XXXX 0 0 XXXX
问题在于,是不是还有其他可能导致程序在一个堆没用完,就开始去新建其它一个堆的情况。
我使用下面代码测试的,开SVMON 观察,系统内存使用情况的:
编译时xlc_r -o memorytest memorytest.cpp -q64- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string>
- #include <vector>
- #include <list>
- using namespace std;
- typedef std::vector<string> VI;
- typedef std::list<string> VJ;
-
- int main(void)
- {
- sleep(20);
- VI v;
- v.clear();
- VJ v1;
- v1.clear();
- int i=0;
- FILE* pf = NULL;
- char buf[5256];
- memset(buf,0x00,5256);
- pf = fopen("/dev/urandom","r");
- if (!pf) {
- printf("open file error! \n");
- return(1);
- }
-
-
- printf("create memory 2!\n");
- char *pch2[5000];
- for(int i=0;i<5000;++i){
- pch2[i]=new char[100000];
- memset(pch2[i],0x00,100000);
- }
- // for(int i=0;i<5000;++i){
- // delete [] pch2[i];
- // }
- sleep(20);
-
- printf("create memory 1!\n");
- while(i<100000){
- memset(buf,0x00,5256);
- fgets(buf, 5255, pf);
- v.push_back(buf);
- i++;
- }
- // printf("deleting memory 1!\n");
- // while(i>0){
- // v.pop_back();
- // i--;
- // }
- sleep(20);
- fclose(pf);
-
- return(0);
- }
复制代码 |
|