由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 如何解释程序内存占用慢慢变高?
相关主题
[合集] Memory leak的问题[合集] 急问:大家一般都用什么profiling工具和memory leak的监
不理解memory leakC++动态内存碎片问题
怎么样分配内存?[合集] 一个C++动态内存回收报错的问题
Heap corruption (转载)valgrind to trace memory crash?
Valgrind报uninitialized value was created by a heap allocat (转载)gdb with big core file
[合集] C++程序运行内存消耗越来越大,怎么回事?Memory Usage问题
求教调试内存错误的经验数据结构的Heap和内存中的Heap有没有联系?
Java马工说c++内存泄漏,哥只能呵呵了如何模拟实现thrashing?
相关话题的讨论汇总
话题: memory话题: 内存话题: pbuffer话题: pool话题: 分配
进入Programming版参与讨论
1 (共1页)
z***e
发帖数: 5393
1
大概是这样一个程序:
char* pBuffer = NULL;
int size= 0;
while(true)
{
size= rand()%5000;
pBuffer = new char[size];
delete[] pBuffer;
}
运行一段时间后,在task manager里面看到内存从最开始的500k变成570k,怎么解释?
我记得以前有说delete[]并没有立刻free内存,但是不记得原因了。
哪位帮忙解释一下?
k******r
发帖数: 2300
2
不是什么牛人,我也不知道答案,但是我猜delete[] 的实现可以是多线程的,就是
delete[] 会立刻返回,但是具体释放内存的任务由另外一个线程实现,就可能出现在
一段时间里,内存的显示不见内存完全释放。

【在 z***e 的大作中提到】
: 大概是这样一个程序:
: char* pBuffer = NULL;
: int size= 0;
: while(true)
: {
: size= rand()%5000;
: pBuffer = new char[size];
: delete[] pBuffer;
: }
: 运行一段时间后,在task manager里面看到内存从最开始的500k变成570k,怎么解释?

t****t
发帖数: 6806
3
猜得不对.

【在 k******r 的大作中提到】
: 不是什么牛人,我也不知道答案,但是我猜delete[] 的实现可以是多线程的,就是
: delete[] 会立刻返回,但是具体释放内存的任务由另外一个线程实现,就可能出现在
: 一段时间里,内存的显示不见内存完全释放。

X****r
发帖数: 3557
4
首先,应用程序看到的已分配内存和操作系统看到的以分配内存是不一样的。程
序开始的时候会有一个有一定大小的堆。这里面的内存在应用程序看来是可用的,
在操作系统看来的已分配的。你的程序里用malloc/new之类的分配内存的时候,
就会在看从现有大小的堆能不能或者方不方便分配,不然的话就从操作系统用
brk/VirtualAlloc之类的申请更多内存加到堆上然后再从堆里面分配。这些
更多申请的内存对操作系统来看是已经分配了的,即使应用程序只用了其中一小
部分,甚至已经用free/delete还了回去。
你这里发生的多半是这样的:虽然你每次分配一片内存就立即把它还回去,但是
为了效率计内存管理库往往并不立即把这一块和其它可用的块并在一起。你下次
分配大小不一样的一块就可能从别的地方取,反复来回堆里的内存块就会变得支
离破碎,造成有时候刚好没有合适大小的内存块分配而需要向操作系统申请更多
的,从而在操作系统看来你的程序使用的内存增加了。

【在 z***e 的大作中提到】
: 大概是这样一个程序:
: char* pBuffer = NULL;
: int size= 0;
: while(true)
: {
: size= rand()%5000;
: pBuffer = new char[size];
: delete[] pBuffer;
: }
: 运行一段时间后,在task manager里面看到内存从最开始的500k变成570k,怎么解释?

f*****Q
发帖数: 1912
5
fragmentation?
b******n
发帖数: 592
6
indeed..also the system can decide if it wants to free the memory or not

【在 f*****Q 的大作中提到】
: fragmentation?
z***e
发帖数: 5393
7
应该差不多是这样。
我翻了翻windows internal,就是free memory并不free page,free之后page变成
standby等待下次再用,加上page fault啥得,还有fragment的问题,慢慢在waitlist
里面的page就变多了。
这个问题是有个公司的一个程序是反复ping一个server,跑了一个星期之后发现task
manager里面内存多占了100多K,非要跑起来说几个win32 api有memory leak...

【在 X****r 的大作中提到】
: 首先,应用程序看到的已分配内存和操作系统看到的以分配内存是不一样的。程
: 序开始的时候会有一个有一定大小的堆。这里面的内存在应用程序看来是可用的,
: 在操作系统看来的已分配的。你的程序里用malloc/new之类的分配内存的时候,
: 就会在看从现有大小的堆能不能或者方不方便分配,不然的话就从操作系统用
: brk/VirtualAlloc之类的申请更多内存加到堆上然后再从堆里面分配。这些
: 更多申请的内存对操作系统来看是已经分配了的,即使应用程序只用了其中一小
: 部分,甚至已经用free/delete还了回去。
: 你这里发生的多半是这样的:虽然你每次分配一片内存就立即把它还回去,但是
: 为了效率计内存管理库往往并不立即把这一块和其它可用的块并在一起。你下次
: 分配大小不一样的一块就可能从别的地方取,反复来回堆里的内存块就会变得支

d*********8
发帖数: 2192
8
自己做一个简单的mem pool就可以了。应该有很多现成的库。
d*********8
发帖数: 2192
9
具体在windows上面,应该有HEAP相关的API。先做一个足够大的HEAP,然后分配内存时
从这个HEAP里取。
f*****Q
发帖数: 1912
10
试试jemalloc吧。
facebook, firefox, freeBSD都用这个。
相关主题
[合集] C++程序运行内存消耗越来越大,怎么回事?[合集] 急问:大家一般都用什么profiling工具和memory leak的监
求教调试内存错误的经验C++动态内存碎片问题
Java马工说c++内存泄漏,哥只能呵呵了[合集] 一个C++动态内存回收报错的问题
进入Programming版参与讨论
t****t
发帖数: 6806
11
don't assume you can do better than libc. most programmer's can not.

【在 d*********8 的大作中提到】
: 自己做一个简单的mem pool就可以了。应该有很多现成的库。
N***m
发帖数: 4460
12
你真是太赞了!

【在 f*****Q 的大作中提到】
: 试试jemalloc吧。
: facebook, firefox, freeBSD都用这个。

b******n
发帖数: 592
13
the disadvantage with memory pool makes memory debuging less easier.
for example, valgrind can easily determine errors without customized memory
pool. if you really need a memory pool, make sure you check valgrind
documentation and use proper memory pool management to help valgrind track
memory.

【在 d*********8 的大作中提到】
: 自己做一个简单的mem pool就可以了。应该有很多现成的库。
L*******r
发帖数: 8961
14
才这么点变化,不用费心思解释。
f*****Q
发帖数: 1912
15
why ne?

【在 N***m 的大作中提到】
: 你真是太赞了!
k******r
发帖数: 2300
16
一个问题,在堆上分配的内存一定是连续的吗?

【在 X****r 的大作中提到】
: 首先,应用程序看到的已分配内存和操作系统看到的以分配内存是不一样的。程
: 序开始的时候会有一个有一定大小的堆。这里面的内存在应用程序看来是可用的,
: 在操作系统看来的已分配的。你的程序里用malloc/new之类的分配内存的时候,
: 就会在看从现有大小的堆能不能或者方不方便分配,不然的话就从操作系统用
: brk/VirtualAlloc之类的申请更多内存加到堆上然后再从堆里面分配。这些
: 更多申请的内存对操作系统来看是已经分配了的,即使应用程序只用了其中一小
: 部分,甚至已经用free/delete还了回去。
: 你这里发生的多半是这样的:虽然你每次分配一片内存就立即把它还回去,但是
: 为了效率计内存管理库往往并不立即把这一块和其它可用的块并在一起。你下次
: 分配大小不一样的一块就可能从别的地方取,反复来回堆里的内存块就会变得支

X****r
发帖数: 3557
17
你是指应用程序用new或malloc之类的调用从堆上分配的内存吗?
每一次分配的当然是连续的。两次分配的内存有可能相邻也可能不相邻,
取决于堆上可用的内存分布和分配的算法。

【在 k******r 的大作中提到】
: 一个问题,在堆上分配的内存一定是连续的吗?
c****e
发帖数: 1453
18
Ask them to preallocate one buffer.
Besides, when you are talking about memory, which counter did you look at,
workingset or virtual memory? Windows tends to delay workingset free so
program can get better performance.But when it's necessary, those pages on
the waitinglist would be freed and used by other processes. So it's cache
not leak.

waitlist

【在 z***e 的大作中提到】
: 应该差不多是这样。
: 我翻了翻windows internal,就是free memory并不free page,free之后page变成
: standby等待下次再用,加上page fault啥得,还有fragment的问题,慢慢在waitlist
: 里面的page就变多了。
: 这个问题是有个公司的一个程序是反复ping一个server,跑了一个星期之后发现task
: manager里面内存多占了100多K,非要跑起来说几个win32 api有memory leak...

s********k
发帖数: 6180
19
这个连续是virtual memory连续还是physical memory的连续?

【在 X****r 的大作中提到】
: 你是指应用程序用new或malloc之类的调用从堆上分配的内存吗?
: 每一次分配的当然是连续的。两次分配的内存有可能相邻也可能不相邻,
: 取决于堆上可用的内存分布和分配的算法。

X****r
发帖数: 3557
20
virtual memory。physical memory的映射对应用程序是不可见的。

【在 s********k 的大作中提到】
: 这个连续是virtual memory连续还是physical memory的连续?
1 (共1页)
进入Programming版参与讨论
相关主题
如何模拟实现thrashing?Valgrind报uninitialized value was created by a heap allocat (转载)
谁给科普一下一般系统的stack和heap内存各有多大?[合集] C++程序运行内存消耗越来越大,怎么回事?
高人指点怎么在embedded sys(atmel 系列)上写内存管理 (转载)求教调试内存错误的经验
java code在不同机器上内存消耗差异很大怎么回事?Java马工说c++内存泄漏,哥只能呵呵了
[合集] Memory leak的问题[合集] 急问:大家一般都用什么profiling工具和memory leak的监
不理解memory leakC++动态内存碎片问题
怎么样分配内存?[合集] 一个C++动态内存回收报错的问题
Heap corruption (转载)valgrind to trace memory crash?
相关话题的讨论汇总
话题: memory话题: 内存话题: pbuffer话题: pool话题: 分配