簡體   English   中英

為什么我的程序泄漏虛擬內存?

[英]Why is my program leaking Virtual Memory?

為了尋找內存泄漏,我一直在使用MemProof,並且能夠查看正在使用,創建和銷毀的資源的實時計數。 在我的程序運行了一天半之后,我注意到其他所有因素都保持不變或更少,虛擬內存(VM)的數量正在增加。 它從109開始,到24小時后達到113。

這是MemProof對每個VM泄漏所說的話:

VirtualAlloc(address_location,16384,4096,4); 它被標識為虛擬內存,其大小始終為16384。API名稱為VirtualAlloc。 該模塊是kernel32.dll。

此外,memproof說:“ virtualalloc在調用進程的虛擬地址空間中保留或提交頁面區域。必須在不再需要時使用virtualFree釋放已分配的頁面。”

VM泄漏與文件System.Pas中的功能相關聯。

功能如下:

function GetCmdShow: Integer;
var
  SI: TStartupInfo;
begin
  Result := 10;                  { SW_SHOWDEFAULT }
  GetStartupInfo(SI);
  if SI.dwFlags and 1 <> 0 then  { STARTF_USESHOWWINDOW }
    Result := SI.wShowWindow;   
end;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

當我單擊虛擬內存泄漏時,Memproof帶我去了關鍵詞“ end”。

那么這是什么意思?

Delphi的FastMM內存管理器在Windows內存系統上運行。 它使用VirtualAlloc從OS分配大塊內存,然后將其分成較小的塊供您的程序使用。 如果釋放大量內存,它將把部分內存還給操作系統。 但是,如果釋放少量內存,則可能會保留它,因為您可能很快會再次需要它。 這是使FastMM快速運行的一部分,而不是內存泄漏。

任何僅監視VirtualAlloc而實際上不注意FastMM所做的事情的內存分析器都將為您提供沒有意義的結果。 正如David在評論中提到的那樣,如果要跟蹤實際內存泄漏,則需要使用FastMM工具。 從SourceForge下載完整版的FastMM並閱讀文檔,以了解如何啟用FullDebugMode以及泄漏報告和日志記錄,您將可以輕松得多。

暫無
暫無

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

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