簡體   English   中英

x64處理器上的32位進程內存泄漏

[英]32 bit process memory leak on x64 processor

我制作了一個始終在x64機器上運行的32位c ++程序。 一位客戶說運行5個此進程實例正在使用所有24 GB RAM。

立即我會認為存在內存泄漏,但是我無法重現此內存問題。

在研究內存分配方面,我發現Windows的內存限制 這告訴我,操作系統不允許32位進程超過2 GB的內存。

64位Windows上的32位應用程序是否有可能使用超過2 GB的內存泄漏?

PS終止進程會導致內存恢復到正常操作級別(約2 GB)。

[編輯]現在,我看到大多數正在使用的內存是內核內存:未分頁。 這是否意味着正在使用某些系統資源而不是內存泄漏?

[更新]問題不是驅動程序或內存泄漏。 這似乎是一個進程句柄泄漏。 有一些東西正在不斷地啟動文件的新句柄。 使用perfmon監視此過程可以發現這一點。 根據經驗,如果進程的處理數量超過2000到3000,則應進行調查。 特別是如果該數字每隔幾秒鍾增加一次。

Windows內存限制中所述,在設置了IMAGE_FILE_LARGE_ADDRESS_AWARE的情況下,在64位系統上,32位進程的限制為4 GB,因此,您的5個進程總共可能消耗20 GB的內存。 可以通過LARGEADDRESSAWARE選項進行設置,該選項可擴展虛擬地址空間。

顯然有可能,因為客戶正在經歷。

(也許您確實希望像一些想法那樣?您提供的信息或代碼不多,所以以一種非常一般的方式,我建議內存分配可能不直接在應用程序本身中。也許應用程序本身只需要〜1 -2GiB,但也會攪動OS做一些愚蠢的事情,例如大小為4 + GiB的文件的虛擬內存映射,或其他設備鎖定,其中設備驅動程序做愚蠢的事情,等等。)

您應該在目標系統上分析內存使用情況,以了解您的代碼確實使用了多少。 然后,您可以嘗試搜索其余部分。

通常,使用/ LARGEADDRESSAWARE:ON鏈接器開關可以允許32位應用程序使用2GB以上的內存。 另外,使用地址窗口擴展可以允許使用更多的內存。 但是,如果您在應用程序中未使用任何這些技術,則它應具有2GB的范圍。 但是,由於上限2GB用於系統資源,也許您正在泄漏系統資源?

暫無
暫無

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

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