2012-12-12 80 views
3

我爲工作寫的程序需要跟蹤自己使用的內存。但它不能監視整個內存的使用情況,我需要它來監視程序中的每個對象以及對象正在使用多少內存,這樣一來,如果使用上述方法,它可以告訴該對象減少內存使用量一定的容量。監視內存使用情況的部分包含一個指向所有創建對象的指針,並通過調用該對象上的方法來追蹤其內存使用情況,該方法返回對象的大小。準確計算由C++編程使用的內存

我遇到的問題是我無法準確計算所用內存的大小。如果我的計算結果稍微偏離了一點也沒關係,但是我有很大的不同。程序計算的大小根據程序的實際內存使用量的1/2到2/3而變化(取決於程序執行的操作)。例如,使用3.35gb RAM的程序計算爲僅使用2.16gb。

當前計算對象大小的方法是將sizeof(* this)添加到對象中任何矢量或數組的長度乘以vector/array中元素的大小。

我計算內存使用的方式有什麼問題嗎?或者有沒有其他的我沒有考慮到?如果有人知道一個程序,你可以通過一個程序的不同方面分析內存使用情況,這也是非常有用的,這樣我可以追蹤所有這些額外內存來自哪裏(最好是一個可以在沒有GUI的情況下在Linux上運行的內存我使用Ubuntu服務器,但也有我可以使用的Windows機器)。

+2

你在這些媒介中保留了哪些物體?如果這些對象動態分配內存(使用'new','malloc'等),'sizeof'將不會佔用這個空間。 – jogojapan

+1

該問題可能來自您正在使用的程序,告訴您有多少內存已分配給您的應用程序(而不是您的代碼進行計算)。問題是這個程序增加了操作系統已經分配給你的應用程序的頁面總數。運行時然後使用分配的頁面進行自己的內存管理(並非所有的內存都可以分配給對象)。 –

+0

一件簡單的事情是:如果大量內存在向量中,請記住使用它們的容量而不是它們的大小來估計實際內存「使用量」(即佔用虛擬地址),而不是理論內存使用量(內存實際上是有用的) 。其他容器由於容器的開銷而要昂貴得多(通常每個元素有幾個指針,當元素是像整數這樣的小對象時會快速加起來。) – rici

回答

2

我計算內存的方式有什麼問題嗎?

是。首先,程序所消耗的內存大小可能不會完全用於任何一點。例如,在矢量調整大小之後,舊的內存塊可能會返回到系統。或者,在下次有人請求相同大小的內存塊時,它可能會被堆保留下來。另外,請記住,您正在使用的任何庫(例如OS API)分配內存,而這些內容不是免費的。

另外請記住,堆管理器會爲每個內存分配施加額外的開銷;通常按照一個或兩個指針的順序進行分配。

如果您想跟蹤應用程序中正在使用的內存,請使用真實的內存分析器。如果您想動態縮放您的程序首先分配的內存量,請使用分析器來計算您正在處理的其中一個對象佔用的平均大小,然後根據對象數量而不是內存大小進行限制。

+0

我曾經說過會有一些開銷,所以沒想到會得到一個確切的結果。但我沒有意識到內存塊可以保存在堆中。這對我的計算爲何如此不同有很大的意義。 –