衆所周知,WebBrowser
控件在某些情況下會增加內存使用量而不會釋放內存。極端情況是在Google即時啓用時在Google中瀏覽網頁時。它每頁增長約3 MB。即使我導航到about:blank
或者如果我處理WebBrowser
,該內存也不會被釋放。在單獨的線程或進程上運行控制,以便100%控制其消耗的內存
我知道任務管理器中的內存不可靠,並且有許多方法可以檢查我的應用程序正在使用的內存,但由於我真正關心的是防止我的應用程序崩潰,因此我正在使用MemoryFailPoint
類來找出我剩下多少內存。和我的previous result一樣,每頁可以使用約3 MB的空間。
我做的最後一項測試是在我的應用程序中創建一個表格,其中只有一個WebBrowser
,在Google上使用Google Instant進行搜索,然後每3秒自動導航到下一頁。剩餘內存將減少,當接近100 MB時,我將關閉表單(這將處理WebBrowser
),並看到內存保持不變。我還用SOS確保WebBrowser
已妥善處置。
GC.Collect()
這些技巧不會釋放內存。安裝IE 8或IE 9也不會。我不想列出所有我嘗試過的東西,因爲這會讓問題太長。我甚至沒有聯繫過微軟的付費支持。
另一方面,關閉並重新啓動應用程序將釋放內存。所以最接近我對這個問題的一個明確的解決方案是重新啓動應用程序。
所以我的問題是,我怎麼能儘可能接近重新啓動應用程序而不實際重新啓動它?我正在考慮在單獨的進程上運行WebBrowser
,並根據需要重新啓動它。與此問題是,我需要在另一個窗體,它會弄亂我的應用程序的用戶界面。
我在想應該有辦法告訴WebBrowser
「請離開我真的不想讓你了!」通過也許卸載任何DLL消耗所有這些內存,然後重新加載它。我正在尋找極端的措施。
請注意,這個問題與我的previous one不一樣。我在這裏需要知道的不是如何釋放WebBrowser
所使用的內存(因爲這是不可能的,或者至少沒有已知的解決方案),但是,一般來說,如果有一種方法可以在「沙箱」,然後清除這個沙箱。非常像在單獨的過程中運行它。
任何想法?
已經嘗試過大部分。檢查過的事件處理程序(也使用SOS確保WebBrowser已經消失)並嘗試了你的第一點。但我真的不會花時間嘗試遷移到'csEXWB',因爲已經閱讀過有關泄漏的信息,而且它也基於IE,所以它很可能會有相同的泄漏,再加上它有0個技術支持,_etc_ 。但awesomium看起來很有希望。我會試一試並回報:)。 – Juan