2015-01-06 67 views
2

我使用sbrk(0)來監視應用程序中動態內存的使用情況。在程序開始時,我做在Windows上是否有相當於sbrk(0)的問題

dynamic_base = sbrk(0);

,並通過該程序的各個點使用

SBRK(O) - dynamic_base

內存使用的當前高水位標記的量度。是否有Windows的等價物?

另外,是否有更好的方法來確定Windows和Unix進程中的動態內存使用情況。

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx –

+1

[內存性能信息](http://msdn.microsoft.com /en-us/library/windows/desktop/aa965225.aspx)。請確保您閱讀了[關於內存管理](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366525.aspx)的所有內容,以便對收集哪些數字做出明智的決定。 – IInspectable

+0

我也會添加一個Linux或Unix標籤,因爲問題也是關於他們的...... –

回答

1

sbrk即使在Linux上也是過時的(例如,因爲不支持多線程)。幾個malloc實現僅使用mmap(2)(並且其中大多數有時使用mmap,至少對於足夠大的malloc-s)。

有沒有更好的方法來確定Linux上的進程中的動態內存使用情況?

(我跳過了問題的一部分的Windows)

在Linux上,你可以(你會更好)使用proc(5)查詢您的內存使用情況。特別是閱讀(這些都是順序僞文件,有點像管道)/proc/self/stat,/proc/self/maps,/proc/self/statm等。例如,fopen他們,fscanf他們,fclose他們很快。沒有涉及到真正的磁盤IO,因爲這些僞文件的內容是由內核根據需要合成的。

而且還有mallinfo(3)malloc_stats(3),至少在Linux上的malloc一些實現。

+0

好吧,sbrk已經過時了。所以你在Windows上做你的mmap()?它是否也有一個稱爲「mmap」的系統調用? – Nulik

+0

我從來沒有使用Windows。我不知道它是否有'mmap'(可能不是本地)。也許最新的「Windows 10上的bash/ubuntu」可能是一種提供Linux系統調用仿真的Linux個性,我真的不知道。 –

1

IInspectable建議的性能計數器可以工作,但它們有點複雜。

如果您只想知道應用程序正在使用的內存量,請致電GlobalMemoryStatusEx並檢查結果的ullTotalVirtualullAvailVirtual成員。

sbrk方法不同,它不區分靜態加載的代碼和數據段,動態加載的模塊,線程堆棧和動態分配(堆)。但的差異在這個數字上會有最大堆大小的差異。

+0

'ullAvailVirtual'不包括未提交的保留內存。該內存本質上不被應用程序使用。由於隨Visual Studio提供的CRT的堆管理器永遠不會將未提交的內存返回給操作系統,而是保留它的保留,所以測量'ullAvailVirtual'將報告值始終低於應用程序可用內存量。在實踐中,除了內存泄漏檢測之外,它幾乎沒有用處。 – IInspectable

+0

@IInspectable:是的,但仍然在使用虛擬地址空間......只有當應用程序使用VirtualAlloc保留未提交頁面時,差異才會很大。在這方面,它按照要求很像「sbrk」。 –

+0

這正是CRT所做的:它不會釋放任何應用程序請求的內存,直到進程終止。當應用程序將內存返回給CRT的內存管理器時,它只會取消內存的提交。內存將保持保留。因此,如果您對應用程序的內存壓力感興趣,那麼'ullAvailVirtual'數字通常是一個不好的方法。 – IInspectable

相關問題