有一個擁有數十萬C#行的大型商業WPF應用程序。我最近被分配給它。該應用程序還使用(最新版本的)第三方組件(知名的第三方組件提供商,我不想列出它們)。Windows 10上的WPF應用程序中的內存泄漏
內存泄漏只發生在某些合作伙伴。他們在早上啓動應用程序,並在完全吃完內存之前使用它幾個小時,最終變得非常慢,以至於不得不重新啓動它(每天幾次)。他們有Windows 10機器(但這可能沒有意義)。我無法重現我身邊的泄漏。
合作伙伴允許我發佈特殊版本的應用程序,但不允許使用Memory Profiler(他們希望使用該應用程序進行製作,並且所連接的Profiler會降低速度)。所以我的想法是:讓我們發佈一個特殊版本,記錄所有內容,包括用戶點擊和處理「可疑」GC根。正如我所說,我不知道我必須調試的代碼,所以我用內存分析器識別了可能泄漏的GC根。 (是的,我列出了可能的罪魁禍首,如依賴屬性,靜態列表等,但目前還沒有運氣。正如我所說的,我不太瞭解源代碼,但我可以訪問它,可以修改它的任何部分。)
我實際上正在編寫一個編程問題:除了用戶行爲和訪問靜態變量之外,還應該記錄什麼?也許我應該在每次用戶操作後記錄空閒內存。什麼是適合.NET的方法?
合作伙伴在重新啓動應用程序之前會複製併發送日誌文件。
我發貨我用[dotTrace的 「自我分析」 API]申請(https://www.jetbrains.com/help/profiler/2016.2/Profiling_Guidelines__Advanced_Profiling_Using_dotTrace_API.html)。用戶可以設置複選框來啓用/禁用性能分析。似乎只有_performance_分析,而不是_memory_分析。 –
我認爲最好的辦法不是記錄所有內容,而是在應用程序變慢時收集內存轉儲。然後讓客戶端將該內存轉儲傳遞給您並進行分析。 – Evk
@Evk:有沒有API方法?這些合作伙伴並不是真正的IT人員,他們希望在進行「分析」或日誌記錄的同時,使用應用程序正常工作。所以他們可以找到日誌txt文件,但不能創建轉儲。他們也不想叫我來創建一個內存轉儲。 (其他問題:應用程序的某些部分寫得不太好,所以內存有時會在我自己的測試中增長很多,但是過了幾分鐘後,出現了一個大的GC,一切都恢復正常,不在他們的機器上......) –