簡體   English   中英

C# 線程未釋放 memory

[英]C# Thread not releasing memory

我有一個用 C#.Net 編寫的 windows 服務。 服務啟動后,我生成了一個新線程,如下所示

new Thread(new ThreadStart(Function1)).Start();

該線程無限循環並執行我的服務預期的職責。 每天一次,我需要同時執行一個不同的操作,我的線程為此產生第二個線程,如下所示

new Thread(new ThreadStart(Function2)).Start(); 

第二個線程執行一個非常簡單的 function。 它使用 FileReadAllLines 讀取文本文件的所有行,快速處理此信息並退出。

我的問題是讀取文件的第二個線程使用的 memory 沒有被收集。 我讓我的服務運行了 3 個小時,希望能調用 GC,但什么也沒發生,任務管理器仍然顯示我的服務正在使用 150mb 的 memory。 讀取和處理文本文件的 function 是一個非常簡單的方法,我確信沒有對包含文本的字符串數組的隱藏引用。 有人可以解釋為什么會這樣嗎? 由另一個生成的線程生成的線程是否有可能無法自行清理?

謝謝

相信垃圾收集器,不要擔心。 150 兆是什么。 您甚至沒有在其中測量文件的大小; 其中大部分將是代碼。

如果您擔心 memory 的發展方向,請先了解 memory 在現代操作系統中的工作原理。 您需要了解虛擬和物理 memory 之間的區別、已提交和已分配 memory 之間的區別以及所有這些,然后再開始拋出諸如“150 兆已分配內存”之類的數字。 請記住,您在 32 位進程中有 2000 兆的虛擬地址空間; 我不認為 150 兆的過程無論如何都很大。

就像 Jon 說的,你要關心的是私有字節的緩慢穩定增長。 如果這沒有發生,那么您就沒有 memory 泄漏。 讓垃圾收集器完成它的工作,不要擔心。

如果您仍然擔心它,請不要使用任務管理器。 獲取 memory 分析器並學習如何使用它。 任務管理器用於通過從 30000 英尺的高度俯視進程來檢查進程。 您需要使用顯微鏡而不是望遠鏡來分析進程如何釋放單個文件的字節。

如果您正在使用 Windows 任務管理器來嘗試計算出使用的 memory,它很可能會欺騙您。 據我所知,CLR 使用的 Memory 通常不會返回到操作系統......所以你可能仍然會看到一個高工作集,即使 memory 中的大部分仍然可以在其中重復使用過程。

如果讓服務運行一周,您是否看到 memory 使用量在一周內穩步攀升,還是僅在第一天增加,然后趨於平穩? 如果是這樣,您肯定認為這是一個問題嗎? 如果是這樣,您可能需要將您的第二個任務放在一個單獨的進程中。

暫無
暫無

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

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