在阅读boost :: test的文档时,我遇到了"自由函数"这个术语.我理解的是,自由函数是任何不返回任何函数的函数(它的返回类型为void).但在进一步阅读后,似乎自由函数也没有任何论据.但我不确定.这些都是我的假设.任何人都可以定义自由功能吗?
我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?
在这方面,什么是以下行为:
如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?
如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.
我需要帮助了解Windows上的内存分配和释放问题.我正在使用最新更新的VS11编译器(VS2012 IDE)(Update 3 RC).
问题是:我为二维数组动态分配一些内存并立即解除分配.仍然,在内存分配之前,我的进程内存使用量在分配前为0.3 MB,在分配时为259,6 MB(预期分配了32768个64位整数阵列(8字节)),分配期间为4106,8 MB,但在释放后内存不会下降到预期的0.3 MB,但仍然停留在12,7 MB.由于我正在释放我已经占用的所有堆内存,我预计内存将回到0.3 MB.
这是我正在使用的C++代码:
#include <iostream>
#define SIZE 32768
int main( int argc, char* argv[] ) {
std::getchar();
int ** p_p_dynamic2d = new int*[SIZE];
for(int i=0; i<SIZE; i++){
p_p_dynamic2d[i] = new int[SIZE];
}
std::getchar();
for(int i=0; i<SIZE; i++){
for(int j=0; j<SIZE; j++){
p_p_dynamic2d[i][j] = j+i;
}
}
std::getchar();
for(int i=0; i<SIZE; i++) {
delete [] p_p_dynamic2d[i];
}
delete [] p_p_dynamic2d;
std::getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 似乎即使我释放了由malloc()分配的Linux进程的所有内存之后,内存仍然为该进程保留,并且没有返回给OS。
默认情况下运行valgrind massif工具不会泄漏。
使用--pages-as-heap = yes运行valgrind会显示以下内容:
-> 13.77%(7,655,424B)0x35FEEEB069:brk(brk.c:31)
-> 13.77%(7,655,424B)0x35FEEEB113:sbrk(sbrk.c:53)
-> 13.77%(7,655,424B)0x35FEE82717:__default_morecore(morecore.c:48)
-> 13.77%(7,655,424B)0x35FEE7DCCB:_int_malloc(malloc.c:2455)
-> 13.77%(7,655,424B)0x35FEE7F4F1:malloc(malloc.c:2862)
因此,即使内存已经由free()释放,似乎malloc调用了brk / sbrk,也没有将其返回给操作系统。
如何强制free()立即调用sbrk()并将所有内存返回给OS?
我在每个MB都非常重要的低端平台上运行。
提前致谢。
在堆上分配内存是一项昂贵的操作,因此一些编程语言避免将其返还给操作系统,即使已分配的内存不再使用。
但是对于很多场景,比如在云上运行的微服务,你会希望内存使用率低,否则费用会很高。因此,在这些情况下,在不使用内存后释放内存非常重要。
什么是 Rust 取消提交并将内存返回给操作系统的默认策略?
这怎么能改变呢?
我的测试代码显示,在free()程序退出之后和之前,堆内存都返回给操作系统。我使用htop(与 相同top)来观察行为。我的 glibc 版本是ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFSIZE 10737418240
int main(){
printf("start\n");
u_int32_t* p = (u_int32_t*)malloc(BUFSIZE);
if (p == NULL){
printf("alloc 10GB failed\n");
exit(1);
}
memset(p, 0, BUFSIZ);
for(size_t i = 0; i < (BUFSIZE / 4); i++){
p[i] = 10;
}
printf("before free\n");
free(p);
sleep(1000);
printf("exit\n");
}
Run Code Online (Sandbox Code Playgroud)
为什么会出现这个问题为什么 free() 函数不将内存返回给操作系统?观察到与我相反的行为?OP也使用linux,问题是在2018年提出的。我错过了什么吗?
c ×2
c++ ×2
free ×2
glibc ×2
malloc ×2
memory ×2
heap-memory ×1
linux ×1
memory-leaks ×1
mmap ×1
rust ×1
tcmalloc ×1
visual-c++ ×1