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 | |
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都用这个。 |
|
|
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 | |
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的连续?
|