我的.NET應用程序在很短的時間內使用非常多的RCW(數千個RCW在不到一秒內)。我能夠衡量這一行爲具有以下性能計數器: - 過程 - >句柄計數 - .NET CLR內存 - >使用的水槽塊的#使用GC.AddMemoryPressure觸發更頻繁的Runtime Callable Wrapper(RCW)最終化是否合適?
我們正確實施各地的RCW IDisposable的包裝對象;我們在各種RCW上以適當的順序調用Marshal.FinalReleaseComObject。
根據this blog post,RCW底層的COM對象實際上並沒有清理完畢,直到RCW完成。
使用GC.AddMemoryPressure來強制GC更快地清理我們的RCW以防止內存不足錯誤是否合適?
這是不恰當的,你沒有一個很好的方法來調用RemoveMemoryPressure() 。這需要一個終結器,一個RCW已經有一個,你不能修改它。如果你確信你正確地調用了FRCO,那麼你只需要更快處理:) –
Hans,我們將每個RCW都包裝在我們自己的C#對象中,每個對象都有一個析構函數。在我們的C#包裝器對象中增加內存壓力是否合適?當然,我們也實現Dispose,它調用Marshal.FinalReleaseComObject。由於我們有一個析構函數,我們可以消除內存壓力。 –
如果您確信您正確地給FRCO打電話,那麼您不應該耗盡內存,也不需要GC的幫助。當你實際上內存不足時,你只能得到OOM,使用AddMemoryPress不會停止。如果你不確信,你不應該這樣做,那麼你最好引用計數你創建的對象並調用GC.Collect ()在一定的值。 –