Dot-Net
如何提高垃圾回收性能?
可以使用哪些優化模式來提高垃圾收集器的性能?
我問的原因是我使用 Compact Framework 做了很多嵌入式軟體。在慢速設備上,垃圾收集可能會成為一個問題,我想減少垃圾收集器啟動的時間,當它啟動時,我希望它更快地完成。我還可以看到,使用垃圾收集器而不是反對它可以幫助改進任何 .NET 或 Java 應用程序,尤其是重型 Web 應用程序。
這是我的一些想法,但我沒有做過任何基準測試。
- 重用臨時類/數組(減少分配計數)
- 將活動對象的數量保持在最低限度(更快的收集)
- 嘗試使用結構而不是類
關鍵是要了解 CF GC 是如何進行分配的。它是一個簡單的標記和清除、非分代 GC,具有特定的算法來觸發 GC,以及在收集後什麼會導致壓縮和/或傾斜。在應用程序級別幾乎無法控制 GC(唯一可用的方法是收集,它的使用非常有限,因為無論如何您都無法強制壓縮)。
對象重用是一個好的開始,但簡單地保持對像數量較少可能是最好的工具之一,因為任何收集操作都必須遍歷所有根。保持步行距離是一個好主意。如果壓縮正在殺死你,那麼防止段碎片將有所幫助。大於 64k 的對像在這方面可能會有所幫助,因為它們有自己的段,並且與較小的對象區別對待。
要真正了解 CF GC 的工作原理,我建議觀看MSDN Webcast on CF memory management。