当前位置: 技术问答>linux和unix
new了以后,马上delete,但是用prstat, pmap查看,内存不减少,为什么?
来源: 互联网 发布时间:2015-09-10
本文导语: new了以后,马上delete,但是用prstat, pmap查看,内存不减少,为什么? 1、 void f() { char * p = new char[1024 * 1024 * 4]; //用prstat,pmap查看,内存增加了4M sleep(5); delete [] p; //del...
new了以后,马上delete,但是用prstat, pmap查看,内存不减少,为什么?
1、
void f()
{
char * p = new char[1024 * 1024 * 4]; //用prstat,pmap查看,内存增加了4M
sleep(5);
delete [] p; //delete完以后,但是用prstat,pmap查看,内存没有减少
}
2、
main()
{
while (1)
{
f (); //这里虽然死循环,但是内存只涨了一次,4M,以后就没有关系了。
}
}
为什么?
3、
同样的程序我在windows下测试,就没有这个现象:new ---- +4M, delete -------- -4M
分不够再加,如果你在深圳,我请你吃饭
1、
void f()
{
char * p = new char[1024 * 1024 * 4]; //用prstat,pmap查看,内存增加了4M
sleep(5);
delete [] p; //delete完以后,但是用prstat,pmap查看,内存没有减少
}
2、
main()
{
while (1)
{
f (); //这里虽然死循环,但是内存只涨了一次,4M,以后就没有关系了。
}
}
为什么?
3、
同样的程序我在windows下测试,就没有这个现象:new ---- +4M, delete -------- -4M
分不够再加,如果你在深圳,我请你吃饭
|
从这个case看,在没有调用new char的时候系统会分配1112k的地址空间,在调用
new char以后,new char会产生一个heap,地址空间大小是1032k。但是地址空间
不代表实际分配的内存,内存是有系统核心分配的,是动态的。而且在一个程序中
循环调用new char和多个并行进程调用new char是个不同的,也不是一个概念。
现在解释一下pmap -x的输出项的含义,
Address 就是一个进程不同段的地址空间。
Kbytes 就是每个段的地址空间的大小
Resident 表示在内存中驻留的段的空间
shared 表示这些北分配的内存是被系统中其他进程共享的。
private 表示只能被该进程使用的空间大小。你可以发现share的空间不具有
private的属性。
Prstat -LP 的输出的意义是:
size 就是该进程占用的地址空间。
RSS 实际被分配的内存的大小。
你看到的resident和RSS不同,是RSS是进程在内存中的实际的大小,这个数值最大
可以达到Resident显示数值。
new char以后,new char会产生一个heap,地址空间大小是1032k。但是地址空间
不代表实际分配的内存,内存是有系统核心分配的,是动态的。而且在一个程序中
循环调用new char和多个并行进程调用new char是个不同的,也不是一个概念。
现在解释一下pmap -x的输出项的含义,
Address 就是一个进程不同段的地址空间。
Kbytes 就是每个段的地址空间的大小
Resident 表示在内存中驻留的段的空间
shared 表示这些北分配的内存是被系统中其他进程共享的。
private 表示只能被该进程使用的空间大小。你可以发现share的空间不具有
private的属性。
Prstat -LP 的输出的意义是:
size 就是该进程占用的地址空间。
RSS 实际被分配的内存的大小。
你看到的resident和RSS不同,是RSS是进程在内存中的实际的大小,这个数值最大
可以达到Resident显示数值。
|
这个...顶一下...
|
prstat, pmap不准?学习
|
会有一个滞后的。
|
up
|
估计是prstat, pmap有个采样时间间隔导致的
|
你试试new前加个getchar()
new完再加个getchar()
delete完再来个getchar()
这个你做完一步看过内存情况后再回到执行程序的地方按下回车,再去看内存情况,
看是否人家说的取样时间间隔的问题!
new完再加个getchar()
delete完再来个getchar()
这个你做完一步看过内存情况后再回到执行程序的地方按下回车,再去看内存情况,
看是否人家说的取样时间间隔的问题!
|
unix好像应该是这样的:
你new了,然后delete,这一快并没有真正释放,delete只是告诉编译器可以重新被使用,没有还给操作系统,所以
main()
{
while (1)
{
f (); //内存只涨了一次,4M
}
}
等你整个程序exit出来后,这4M内存才释放。
你new了,然后delete,这一快并没有真正释放,delete只是告诉编译器可以重新被使用,没有还给操作系统,所以
main()
{
while (1)
{
f (); //内存只涨了一次,4M
}
}
等你整个程序exit出来后,这4M内存才释放。
|
linux 内存管理的机制问题,不是马上回收释放的内存,而是再适当的时候才回收
|
gz
|
顶
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。