簡體   English   中英

麻煩的GC.collect()調用第三方庫

[英]Troublesome GC.collect() calls in third-party library

在分析我的應用程序(C#,.NET 4)時,我注意到我使用的第三方庫顯式調用GC.Collect()。 這非常令人討厭,因為它有時會對我的應用程序性能產生巨大影響,因為對這個庫的一些調用最終會產生巨大的循環:在GC.Collect中花費的時間占總執行時間的80%以上。

當然,我向庫維護者報告了這種行為(lib不是開源的),但是當他們正在開發新版本時,我想優化我的應用程序。 我能做什么?

我嘗試通過將GCSettings.LatencyMode設置為GCLatencyMode.LowLatency來配置GC(當然,僅在執行庫調用期間),但無濟於事。 我寧願避免分叉我的過程。

有任何想法嗎?

您可以采取兩條道路,第一條是自己修補,第二條是通知圖書館的開發者(提交錯誤報告)。

自己修補相當容易,將RedGates ReflectorReflexil AddIn一起使用並修補庫。 你也可以得到DotNet IL編輯器 ,它基本上做同樣的事情,但是是FLOSS。

“自己修補”方法的問題在於它有缺點:

  • 未來版本的庫也需要修補。 所以你最好記錄下你做了什么。
  • 你不理解庫的內部,如果有10個GC.Collect()調用,只有其中一個是合法的(我懷疑它,但可能),你將通過刪除所有這些來打破庫。
  • 您很可能會違反圖書館的許可證,這可能會讓您陷入法律地獄。 但這取決於您如何使用庫以及使用什么軟件以及最終包的分發方式。

您可以做的另一件事是向庫的原始開發人員提交錯誤。 確保您不會沾沾自喜,而是提供有用的資源,例如GC上的MSDN文章和測試應用程序以及顯示問題的分析器的結果。

在嘗試破解事物以防止代碼執行GC之前,詢問它為什么會這樣做可能會有用。 雖然編寫良好的代碼應該只是在.Net認為有必要時調用GC時,編寫代碼時肯定有可能需要在特定時間運行GC以確保正確性。 我可以想象代碼可能會調用GC的三個原因:

  1. GC調用被添加用於內存分析目的,並且無意中/不恰當地離開了它。
  2. 開發人員認為這似乎是一個好主意,盡管它沒有提供真正的好處。
  3. 某些類型的托管資源被錯誤地放棄了; 強制GC可以允許以足夠及時的方式清理這種被放棄的資源,以允許正確(盡管很慢)的程序執行。

如果由於方案3而存在強制GC,則刪除它可能會導致不良事件發生。

暫無
暫無

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

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