当前位置:  技术问答>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

分不够再加,如果你在深圳,我请你吃饭

|
从这个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显示数值。

|
这个...顶一下...

|
prstat, pmap不准?学习

|
会有一个滞后的。

|
up

|
估计是prstat, pmap有个采样时间间隔导致的

|
你试试new前加个getchar()
new完再加个getchar()
delete完再来个getchar()

这个你做完一步看过内存情况后再回到执行程序的地方按下回车,再去看内存情况,
看是否人家说的取样时间间隔的问题!

|
unix好像应该是这样的:
你new了,然后delete,这一快并没有真正释放,delete只是告诉编译器可以重新被使用,没有还给操作系统,所以
main()
{
    while (1)
    {
       f ();   //内存只涨了一次,4M
    }
}
等你整个程序exit出来后,这4M内存才释放。

|
linux 内存管理的机制问题,不是马上回收释放的内存,而是再适当的时候才回收

|
gz

|

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c/c++中的内存分配 malloc 和 new介绍及相互之间的区别
  • linux 频繁new/delete 内存持续增长
  • AIX上可以new出来的内存有没有限制?
  • 在linux下能不能创建一个堆,然后给堆指定一块共享内存,然后各个程序用此堆来new对象来共享?
  • 在pthread function 里面我用new 分配的内存问题 。。。
  • GTK+中类似gtk_hbox_new这样的给构件分配内存的函数 为什么不用手动释放?
  • new几个相同的类,对于方法(method)的内存分配问题?大家公用一块方法的空间,还是每个都有自己的空间?
  • 和 new 对应的 删除某个变量所占内存的是什么?free? destory?...
  • 为什么多线程编程中new的内存在delete时出现非法操作?
  • java命名空间java.lang枚举thread.state的类成员方法: new定义及介绍
  • 我如何将read = new BufferedReader(new InputStreamReader(serverIn));从屏幕上打印出来?
  • java命名空间javax.print.attribute.standard类multipledocumenthandling的类成员方法: single_document_new_sheet定义及介绍
  • jb中entitybean的add new finder和add new select有什么不同
  • C++操作符(Operator)用法(new和重载)
  • 菜鸟问题(对象数组):对于clsA []=new claA[10];语句执行后是否已经拥有了类clsA的10个实例对象,还是要再for i=0 to 9对clsA[i]=new clsA一下?
  • CSS3 target-new 属性
  • 我是初学者,问一个比较傻的问题:既然JAVA是一种纯面向对象的语言,那么为什么int i=new int()或int i=new int(1)不能通过编译?谢谢。
  • PHP中new static()与new self()的区别异同分析
  • 有关new和delete的问题
  • Happy new Year!!!!!!!!!!!!!!!!
  • 若和知道一个对象被 new过?
  • Linux编程是否可以用new?
  • Button bn=new Button("OK");怎么会报错?
  • 请教各位关于 new
  • 关于new的疑惑..
  • 在new ImageIcon()中使用相对路径怎么没有用?
  • 如何得到自己被谁new了?
  • 新手提问 在线等待,为什么我的程序中 new 操作符出错?
  • 关于QT中的new和delete
  • c++ linux下new 出问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3