我們正在處理.Net程序中的GC太快。 因爲我們使用具有本地資源的類,並且不調用GC.KeepAlive(),GC在本機訪問結束之前收集對象。結果程序崩潰了。如何使JIT擴展堆棧變量到示波器末端(GC太快)
Does the .NET garbage collector perform predictive analysis of code?
像這樣: 這裏描述我們有完全相同的問題
{ var img = new ImageWithNativePtr();
IntPtr p = img.GetData();
// DANGER!
ProcessData(p);
}
的觀點是:JIT生成表明,IMG是不是在點時使用的GC信息GetData()運行。如果一個GC線程在正確的時間到來,它收集img和程序崩潰。可以通過附加GC.KeepAlive(img)來解決這個問題。 不幸的是,已經寫了太多的代碼(在太多的地方),很容易糾正這個問題。
因此:有沒有例如一個屬性(即ImageWithNativePtr)使JIT的行爲就像在一個調試版本?在Debug構建中,變量img將保持有效,直到作用域結束(}),而在Release中,它在註釋DANGER時失去有效性。
我相信'GC.KeepAlive'是你唯一的選擇。 –
您的非託管資源是否需要某種處置? –
取決於愚蠢實現的代碼被破壞。 – delnan