2012-03-15 83 views
4

這是此問題的後續行動:What could explain the difference in memory usage reported by FastMM or GetProcessMemoryInfo?如何在Delphi應用程序中分析過多的內存消耗(PageFileUsage)?

我的Delphi XE應用程序正在使用非常大量的內存,有時會導致內存不足異常。我試圖理解爲什麼和什麼導致這種內存使用,而FastMM報告低內存使用情況,請求TProcessMemoryCounters.PageFileUsage時,我可以清楚地看到,應用程序使用了很多內存。

我想知道是什麼原因造成這個問題,並希望就如何處理它的一些提醒:

  • 有沒有辦法知道什麼是包含在內存和它已被分配?
  • 是否有一些工具可以通過Delphi應用程序中的行/過程跟蹤內存使用情況?
  • 任何一般建議如何處理這樣的問題?

EDIT 1:下面是FastMMUsageTracker的兩個截圖,指示存儲器一直由系統分配。

  • 前進程啓動:

Before process starts

  • 過程結束後:

After process ends

注:淺紅色的FastMM分配和深灰色我分配給系統。

我想了解是什麼導致系統使用這麼多內存。可能通過理解該內存中包含的內容或哪些代碼或過程確實會導致該分配。

編輯2:我寧可不使用完整版本AQTime的多種原因:

  • 我使用多個虛擬機的發展正在和他們的許可制度是一個PITA(我已經TestComplete的註冊用戶)
  • LITE版本不提供足夠的信息,也沒有留下一定的完整版本將會給我有價值的信息

任何其他SUG我不會浪費錢gestions?

+2

這個問題的答案[Profiler和內存分析工具爲Delphi](http://stackoverflow.com/questions/291631/profiler-and-memory-analysis-tools-for-delphi)可以幫助你。 – RRUZ 2012-03-15 13:47:09

+0

@RRUZ它看起來很有趣,但它看起來像所有答案都是「時間剖析器」相關的,並且幾乎沒有關於內存使用情況分析的信息 – jonjbar 2012-03-15 14:03:14

+0

我會嘗試定期記錄由FastMM返回的值,以便從您的應用的不同位置代碼以及簡短的位置信息添加到日誌文件中。我正在研究一個通用工具(VisualMM),它也顯示時間線,請參閱http://mikejustin.wordpress.com/ – mjn 2012-03-18 09:34:01

回答

4

另一個問題可能是堆碎片。這意味着你有足夠的內存空間,但所有的空閒塊都很小。您可以通過使用源碼版本FastMM直觀地看到它,並使用建議here的FastMMUsageTracker.pas。

+0

This是有趣的,它看起來像證明它不是由於空閒塊。這是一個之前的圖:http://i.imgur.com/uYFBq.png - 當內存已滿時的圖:http://我。 imgur.com/fpfet.png - 任何想法如何我可以繼續調查? – jonjbar 2012-03-16 09:10:12

+1

如果它不是堆碎片我會建議使用像AQTime這樣的工具,因爲@Warren建議 – 2012-03-16 10:00:13

+0

我已經更新了我的問題,以澄清我想避免AQTime。您建議的任何其他工具? – jonjbar 2012-03-18 08:43:02

4

您需要一個分析器,但即使這樣,在很多地方和案例中都不夠用。另外,就你而言,你需要全功能的AQTime,而不是Delphi XE和XE2附帶的精簡版。 (AQTIME是非常昂貴的,煩人的節點鎖定,所以不要認爲我是SmartBear軟件的先行者。)

事情是人們經常會錯誤地將AQTime Allocation Profiler誤認爲是發現泄漏的一種方法。它也可以告訴你你的記憶在哪裏,至少在工具的範圍內。在運行並消耗大量內存時,我單擊運行 - >獲取結果。

這是我的一個應用程序在AQTime中的配置文件,它的分配Profiler顯示了什麼類正在分配堆上的實例數以及它們使用的內存量。由於您使用FastMM報告了Delphi堆的低使用情況,這告訴我AQTime的大部分功能都可以通過delphi類名進行分析,這對您也是無用的。但是,通過使用AQTime的事件和觸發器,您可能會弄清楚應用程序的哪些區域會導致您產生「內存使用費用」,並在出現這些情況時會花費什麼。 AQTime的實時檢測可能足以幫助您縮小原因,即使它可能找不到自動導致內存使用最多的函數調用。

enter image description here enter image description here enter image description here 列名包括「對象名稱」,其中包括這樣的事情: *德爾福類,它們的實例數和堆的使用情況。 *虛擬內存塊通過Win32調用分配。

它可以檢測堆上的Delphi和C/C++庫分配,並可以看到某些Windows API級內存分配。

請注意對象的實時計數,即使用的堆的內存量。

我通常通過測量堆內存使用之前和之後的一些昂貴的操作,但在從昂貴的操作中清除(釋放)內存之前,試圖找出特定操作的內存開銷。我可以在AQTime中設置事件點,當一個特定的方法被擊中或者一個標誌被我打開時,我可以在值之前和之後測量,然後比較它們。

單獨的FastMM甚至無法檢測到非delphi分配或從不由FastMM管理的堆分配。 AQTime不限於此。

+0

@Warrent謝謝,我試過你的解決方案(僅限於AQTime Lite,因爲完整版本太限制或昂貴),但我看到了非常不同的內存使用情況結果(也檢查系統內存):AQTime報告81,339,834,當TProcessMemoryCounters.PageFileUsage報告983,592,960。是否由於lite版本?還有如何解釋結果以獲得一些有用的信息:VCL本機內存或承諾虛擬內存沒有多大幫助? – jonjbar 2012-03-15 17:05:04

+0

我非常懷疑你會從LITE版本中獲得很多用途,正如我在上面所說的那樣!由於它缺少LITE版本中對於事件的支持,甚至沒有我在上面顯示的同樣的實時視圖,所以使用LITE版本將會對您的需求非常有限。 – 2012-03-15 17:05:58

+0

我可以訪問如上所示的實時視圖。不過,我不確定爲什麼lite版本會根據與完整版本的比較報告內存使用情況的差異:http://support.smartbear.com/products/more-info/aqtime/standard-for-rad-studio- vs-pro? – jonjbar 2012-03-15 17:14:50