簡體   English   中英

Delphi:FastMM虛擬內存管理參考?

[英]Delphi: FastMM virtual memory management reference?

我最近遇到了一個問題(請參閱我的上一個問題),這讓我仔細研究了我的Delphi應用程序中的內存管理。 在我第一次探索之后,我有兩個問題。

我開始玩FastMMUsageTracker,並注意到以下內容。 當我打開應用程序使用的文件(也創建表單等...)時,應用程序的可用虛擬內存變化與“FastMM4已分配”內存的變化之間存在顯着差異。

首先,我對術語感到有點困惑:為什么會有一些FastMM分配的內存和一些“系統分配”(和保留)的內存? 由於FastMM是內存管理器,為什么系統負責分配一些內存?

另外,如何獲得有關哪些對象/結構已分配該內存的更多詳細信息? VM圖表僅用於顯示“系統分配”,“系統保留”或“FastMM已分配”的內存量,但沒有指向需要該內存的實際對象的鏈接。 例如,是否可以獲得報告,執行中期,類似於FastMM在關閉應用程序時生成的內容? FastMM顯然在某處存儲了這些信息。


作為對我的獎勵,如果人們可以就該主題推薦一個很好的參考(書籍,網站),也會非常感激。 網上有大量的信息,但它通常是特定於案例和面向專家的。

謝謝!

PS:這不是關於發現泄漏,沒有問題,只是試圖更好地理解內存管理並為未來做好先發制人,因為我們的應用程序使用越來越多的內存。

你的一些問題很簡單。 嗯,無論如何其中之一!

為什么有一些FastMM分配的內存和一些“系統分配”(和保留)內存? 由於FastMM是內存管理器,為什么系統負責分配一些內存?

您在Delphi中編寫的代碼只是您的流程中運行的代碼的一部分。 您以DLL的形式使用第三方庫,最着名的是Windows API。 例如,在你創建Delphi表單的任何時候,它背后都有許多消耗內存的windows對象。 這個內存不會被FastMM分配,我認為你的問題就是所謂的“系統分配”。

但是,如果你想更深入,那么這很快就會成為一個非常復雜的話題。 如果你想深入了解Windows內存管理的實現,那么我認為你需要咨詢一個嚴肅的參考資料。 我推薦Mark Russinovich,David Solomon和Alex Ionescu的Windows Internals

首先,我對術語感到有點困惑:為什么會有一些FastMM分配的內存和一些“系統分配”(和保留)的內存? 由於FastMM是內存管理器,為什么系統負責分配一些內存?

你認為FastMM在哪里獲得要分配的內存? 當然,它來自系統。

當您的應用啟動時,FastMM會從系統中獲取一塊內存。 當您要求使用某些內存時(無論是使用GetMem,New還是TSomething.Create),FastMM會嘗試從第一個初始塊提供給您。 如果那里還不夠,FastMM會從系統中請求更多(如果可能的話,在一個塊中),並返回一大塊給你。 當你釋放某些東西時,FastMM不會將該內存返回給操作系統,因為它表示你會再次使用它。 它只是在內部標記為未使用。 它還嘗試重新排列未使用的塊,以便它們盡可能連續,以便不必為了更加不必要地返回操作系統。 (但是,這種重新排列並不總是可行的;這就是你最終會因為多次調整動態數組大小,大量對象創建和釋放等等而導致內存碎片的地方。)

除了在您的應用程序中管理的內存FastMM之外,系統還為堆棧和堆留出了空間。 每個進程在啟動時都會獲得一個巨大的堆棧空間,作為放置變量的空間。 這個堆棧(和堆)可以根據需要動態增長。

當您的應用程序退出時,它分配的所有內存都將釋放回操作系統。 (它可能不會立即出現在任務管理器中,但確實如此。)

例如,是否可以獲得報告,執行中期,類似於FastMM在關閉應用程序時生成的內容?

不是我能說的。 因為FastMM將它存儲在某個地方並不一定意味着有一種方法可以在運行時從內存管理器外部訪問它。 您可以查看FastMMUsageTracker的源代碼,了解如何檢索信息(使用RefreshSnapshot方法中的GetMemoryManagerState和GetMemoryMap)。 FastMM4的來源也可用; 您可以查看並查看可用的公共方法。

FastMM自己的文檔(以自述文件,FastMM4Options.inc注釋和FastMM4_FAQ.txt文件的形式)在某種程度上有助於解釋它的工作原理以及可用的調試選項(和信息)。

有關進程正在使用的內存的詳細地圖,請嘗試www.sysinternals.com上的 VMMAP(也由Mark Russinovich共同撰寫,David的回答中提到)。 這也允許您查看某些位置中存儲的內容(選擇細節線時鍵入control-T)。

警告:您的進程使用的內存比您想象的要多得多。 您可能需要先閱讀本書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM