2009-07-22 55 views
7

我有一個實驗程序長時間運行的內存,我想知道它是實際的內存佔用量。任務管理器說(在windows7-64中)應用程序消耗800MB內存,但根據任務管理器分配的總內存量爲3.7GB。所有分配的內存總和不等於3.7GB。我怎樣才能確定我的應用程序實際在使用多少內存?我的Windows應用程序真正使用多少內存?

推論:任務管理器實際報告的內存是什麼?它似乎並不是分配給應用程序本身的全部內存。

回答

2

據我所知,任務管理器顯示工作集;

工作組:該組最近通過 進程的線程感動內存頁 。如果 計算機中的可用內存超過閾值,則 頁面將保留在 進程的工作集中,即使它們不是 使用。當空閒內存低於 閾值時,頁面將從 工作集中刪除。

通過http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx

你可以得到任務管理器來顯示虛擬內存。

我通常使用perfmon(開始 - >運行... - > perfmon)跟蹤內存使用情況,使用專用字節計數器。它反映了你的正常分配器分配的內存(new/HeapAlloc/malloc等)。

0

這取決於你在說什麼內存。不幸的是,有很多不同的方法來測量內存。例如...

  • 分配的物理內存
  • 虛擬內存分配
  • 虛擬內存保留(但不提交)
  • 專用字節
  • 共享字節

哪一項指標是你有興趣嗎?

我認爲大多數人傾向於對「虛擬內存分配」類別感興趣。

+0

這是因爲你通常無法控制內存何時交換到磁盤?看來物理內存分配是導致問題的原因之一,我不清楚這種相互關係本身... – RedFilter 2009-07-22 16:35:03

+0

@OrbMan,我不確定第一部分,我不會計算出一些API存在的說:「請不要換出這頁的內存」但我不知道一個手頭 – JaredPar 2009-07-22 16:42:22

+0

@JaredPar:我感興趣的是64位地址空間已分配多少,而不一定是那個內存得到的地方如何,我的陣列有多少和多大?我沒有刪除一個或兩個我認爲已經擁有的那些我犯了一些錯誤嗎? – mmr 2009-07-22 16:49:09

2

內存是一個棘手的事情來衡量。應用程序可能會保留大量的virtual memory,但實際上並未使用其中的大部分。一些內存可能是共享的;也就是說,一個共享的DLL可能會被加載到多個應用程序的地址空間中,但它只會被加載到物理內存中一次。

一個好的方法是working set,它是最近訪問過的虛擬地址空間中的一組頁面。 「最近訪問」的含義取決於操作系統及其page replacement algorithm。換句話說,它是映射到物理內存並且正在使用的實際虛擬頁面集合。這是任務管理器向您顯示的內容。

虛擬內存使用量是已經保留的虛擬頁面數量(請注意,並非所有這些實際上都會被提交,也就是說,物理後備存儲已分配給它)。通過點擊查看任務管理器 - >選擇列

最重要的事情,雖然:如果要實際測量你的程序使用多少內存,看看是否需要優化它的一些空間或選擇更好的數據結構或者把一些東西存放到磁盤上,使用任務管理器是錯誤的方法。你應該幾乎可以肯定使用一個profiler。

0

由任務管理器顯示的內存統計信息幾乎不是所有可用的統計信息,也沒有特別好地呈現。我會使用Microsoft Sysinternals的免費工具VMMap來進一步分析應用程序使用的內存。

如果它是一個長時間運行的應用程序,並且隨着時間的推移內存使用量會不斷增加,它將會成爲不斷增長的堆。堆的部分可能隨時也可能不會被分頁到磁盤,但您確實需要優化堆的使用情況。在這種情況下,您需要分析您的應用程序。如果它是一個.Net應用程序,那麼我可以推薦Redgate的ANTS分析器。這是非常容易使用。如果它是本地應用程序,那麼英特爾vtune分析器功能非常強大。您不需要爲任何工具分析流程的源代碼。

這兩個應用程序都有免費試用。祝你好運。

P.S.對不起,我沒有包含更多的工具超鏈接,但這是我的第一篇文章,並且stackoverflow限制第一篇文章到一個超鏈接:-(

相關問題