在Windows上是否有等效的sbrk(0)

时间:2015-01-06 16:27:32

标签: c windows memory-management

我使用sbrk(0)来监视应用程序中动态内存的使用情况。在程序开始时我做了

dynamic_base = sbrk(0);

以及通过程序使用的各个要点

sbrk(0) - dynamic_base

衡量当前内存使用量的高水位线。是否有Windows的等价物?

或者,是否有更好的方法可以在Windows和Unix的进程中确定动态内存使用情况。

3 个答案:

答案 0 :(得分:1)

sbrk已经过时,即使在Linux上也是如此(例如,因为不是多线程友好的)。几个malloc实现仅使用mmap(2)(其中大多数有时使用mmap至少足够大malloc - s)。

  

是否有更好的方法可以在Linux上的进程中确定动态内存使用情况?

(我正在跳过问题的Windows部分)

在Linux上你可以(而且你会更好)使用proc(5)来查询你的内存使用情况。特别是,阅读(这些是连续的伪文件,有点像管道)/proc/self/stat/proc/self/maps/proc/self/statm等。例如,fopen他们,{{1}他们,fscanf他们很快。没有涉及真正的磁盘IO,因为这些伪文件的内容是由内核按需合成的。

还有mallinfo(3)malloc_stats(3),至少对于Linux上的fclose某些实现。

答案 1 :(得分:1)

IInspectable建议的性能计数器将起作用,但它们有点复杂。

如果您只想知道应用程序使用的内存量,请致电GlobalMemoryStatusEx并检查结果的ullTotalVirtualullAvailVirtual成员。

sbrk方法不同,它不区分静态加载的代码和数据部分,动态加载的模块,线程堆栈和动态分配(堆)。但是,此数字中的差异将是最大堆大小的差异。

答案 2 :(得分:0)

VirtualAlloc是Windows中的粗略对等。