簡體   English   中英

C# 垃圾回收

[英]C# garbage collection

我有一個我編寫的商業應用程序,它通過目錄結構有效地遞歸查找特定的 Excel 文件,並存儲它們的地址。 然后它遍歷這些文件並通過為每個文件創建一個 DocumentParser object 來解析它們,這是一次完成一個,而不是異步的。 該軟件似乎非常穩定,以至於企業希望通過包含超過 10000 個相關 Excel 文件的龐大目錄來運行它以遞歸。

My question is, as I am creating a new DocumentParser object each time, will the GC be effective enough to discard each of the objects when they go out of scope, ie when that Excel sheet has been parsed, or is there a way I can監控這一點並在必要時手動執行 GC? 我以前從未處理過如此大量的數據,通常一次最多只能在 40-50 個 Excel 文件上進行測試。

謝謝。

GC 是一個非常復雜的軟件。 GC 至少是唯一知道何時需要進行垃圾收集的。 所以我的建議是讓 GC 自行處理。

另外:GC 將處理這些質量對象。 也許您會意識到性能下降。 如果這是一個問題,您可以嘗試優化您的代碼。 但還不算早。

我會把 GC 留給它自己做。 10,000 個對象對於 GC 來說並不算多。 GC 工作的成本很可能遠低於 Excel 工作的成本。 所以不值得讓你的設計復雜化來調整 GC 的東西。 如果您最終要處理的文件太多,以至於您的應用程序無法及時完成,那么很可能是 Excel 處理的速度阻礙了您。

但是有一點可能相關:如果 DocumentParser 在處理 Excel 文件時使用非托管 memory,您可以使用 GC.Add/RemoveMemoryPressure 向 GC 指示打開文件時的實際增加成本。 如果您沒有自己編寫 DocumentParser,那么作者可能已經在這樣做了。

這里的問題是您可能有一個托管的 object,它的成本約為 100 個字節,當它執行 Excel 工作時,它會分配大量的非托管 memory。 GC 將無法知道這一點,因此這些方法有助於通知 GC,memory 壓力比它意識到的要多。 這可能會改變其決定收集的方式/時間的行為,這可能導致應用程序保持較低的 memory 占用空間。 如果應用程序的 memory 使用量隨着時間的推移而膨脹,那么您可能會開始看到由於垃圾收集長度和機器上的分頁而導致的一些減慢(取決於您擁有多少 memory)。 您需要密切注意其 memory 的使用情況,以確保它在處理時不會泄漏 memory - memory 分析器可能會有所幫助。

您不需要手動調用 GC,除非您持有一些非常大的資源,而您的情況並非如此。 GC 會在每次調用時自行調整,如果您手動調用它,您只會破壞其內部分析數據。

順便說一句,GC 不僅可以在它超出 scope 時收集東西,而且在它最后一次使用之后(即它仍在 scope 中但不再使用該變量)。

是和否 - GC 足夠有效,可以在需要時釋放,但您通常無法確定何時釋放。

有一種方法可以強制進行 GC 收集,但通常認為它在生產代碼中是不好的做法,因為在不需要時強制堆棧遍歷的效果比在 GC 決定需要釋放之前使用一點額外的 memory 更糟糕資源分配更多的對象。

暫無
暫無

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

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