我使用sbrk(0)來監視應用程序中動態內存的使用情況。在程序開始時,我做在Windows上是否有相當於sbrk(0)的問題
dynamic_base = sbrk(0);
,並通過該程序的各個點使用
SBRK(O) - dynamic_base
內存使用的當前高水位標記的量度。是否有Windows的等價物?
另外,是否有更好的方法來確定Windows和Unix進程中的動態內存使用情況。
我使用sbrk(0)來監視應用程序中動態內存的使用情況。在程序開始時,我做在Windows上是否有相當於sbrk(0)的問題
dynamic_base = sbrk(0);
,並通過該程序的各個點使用
SBRK(O) - dynamic_base
內存使用的當前高水位標記的量度。是否有Windows的等價物?
另外,是否有更好的方法來確定Windows和Unix進程中的動態內存使用情況。
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
一些實現。
好吧,sbrk已經過時了。所以你在Windows上做你的mmap()?它是否也有一個稱爲「mmap」的系統調用? – Nulik
我從來沒有使用Windows。我不知道它是否有'mmap'(可能不是本地)。也許最新的「Windows 10上的bash/ubuntu」可能是一種提供Linux系統調用仿真的Linux個性,我真的不知道。 –
VirtualAlloc在Windows中大致相當。
IInspectable建議的性能計數器可以工作,但它們有點複雜。
如果您只想知道應用程序正在使用的內存量,請致電GlobalMemoryStatusEx
並檢查結果的ullTotalVirtual
和ullAvailVirtual
成員。
與sbrk
方法不同,它不區分靜態加載的代碼和數據段,動態加載的模塊,線程堆棧和動態分配(堆)。但的差異在這個數字上會有最大堆大小的差異。
'ullAvailVirtual'不包括未提交的保留內存。該內存本質上不被應用程序使用。由於隨Visual Studio提供的CRT的堆管理器永遠不會將未提交的內存返回給操作系統,而是保留它的保留,所以測量'ullAvailVirtual'將報告值始終低於應用程序可用內存量。在實踐中,除了內存泄漏檢測之外,它幾乎沒有用處。 – IInspectable
@IInspectable:是的,但仍然在使用虛擬地址空間......只有當應用程序使用VirtualAlloc保留未提交頁面時,差異才會很大。在這方面,它按照要求很像「sbrk」。 –
這正是CRT所做的:它不會釋放任何應用程序請求的內存,直到進程終止。當應用程序將內存返回給CRT的內存管理器時,它只會取消內存的提交。內存將保持保留。因此,如果您對應用程序的內存壓力感興趣,那麼'ullAvailVirtual'數字通常是一個不好的方法。 – IInspectable
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx –
[內存性能信息](http://msdn.microsoft.com /en-us/library/windows/desktop/aa965225.aspx)。請確保您閱讀了[關於內存管理](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366525.aspx)的所有內容,以便對收集哪些數字做出明智的決定。 – IInspectable
我也會添加一個Linux或Unix標籤,因爲問題也是關於他們的...... –