2012-04-05 77 views
0

我正在尋找一種策略,可以檢測系統即將耗盡內存並使用Application.Restart()重新啓動系統時的策略。預防或預測內存不足異常

WebBorwser控件導致我採用此路由,因爲即使在處理附加到表單上的webbrowser控件後,內存使用情況並沒有減少,並且在任何地方我都看到這是一個IE問題,我們處於他們的擺佈之中。 (雖然我注意到,如果我打開IE瀏覽器,運行相同的網站,內存增加,但當我關閉標籤時,適當減少...)

我不想移動到webkit,因爲watin不兼容,我不打算使用GeckoFX,因爲它不支持javascript或jquery支持,我不打算使用外部瀏覽器實例,因爲嵌入式瀏覽器控件是我的界面設計的一部分。

所以現在我想要做的是創建一個動態檢查可用內存與總內存的方法,並執行重新啓動,當情況變得至關重要,妥善處理GC無法達到的資源,我不能編程如何摧毀。

我相信我可以做到這一點,並從我停止的地方重新啓動我的自動化,然後循環這個守護進程。

任何人都可以幫我弄清楚如何編碼內存檢查?它應該很容易。我發現這個線程,但我遇到了一些麻煩,而不會遇到錯誤......也許另一種方法會更好? How do you get total amount of RAM the computer has?

謝謝你們!我希望這有助於

+3

OOM是關於地址空間,而不是物理RAM。 – CodesInChaos 2012-04-05 22:06:41

+0

讓我想起「select is broken」 – 2012-04-05 22:11:11

+0

那麼你真的在使用一個探查器或者只是在做一個arm-chair內存分析,就像使用任務管理器一樣? – 2012-04-05 22:11:57

回答

0

Asp.Net將從httpcache驅逐東西,當它注意到它爲低的可用內存,你可以走一趟到通過反射框架的一部分和它是如何做工作學習那裏...

+2

@AdamMaras:你錯過了這一點。 Andreas的觀點是,ASP以某種方式發現內存不足,因此您可以對ASP進行反向工程,以瞭解它的工作原理。這不是我個人建議任何人進行的方式,請關注你。 – 2012-04-05 22:27:19

+0

難道你不能只是編程設置web瀏覽器控件實例,以防止緩存? (我假設瀏覽器會話期間的httpcache和圖像/頁面緩存是同樣的事情)...讀這個IE問題很多人認爲內存蔓延是由於緩存。但是和我一樣,還有更多的白癡試圖解決webbrowser內存泄露問題......而且如果沒有內存分析器,你們將很難相信我的問題與webbrowser控件有關對於某些... – atwellpub 2012-04-05 22:35:50

+0

@EricLippert我不知道ASP如何做到這一點,但我懷疑只有在您託管CLR時才能成功完成此操作。 – 2012-04-05 22:52:24

1

這並沒有太大的意義。出現OOM是因爲CLR內存管理器無法分配所需內存。這可能是由於許多原因造成的。在所有分配而不是之前查看可用的RAM(這是完全不相關的)或甚至可用的GC存儲器,以確保沒有OOM。例如。如果存在LOH碎片,則可用字節總數可能會超出分配需求,但如果CLR無法從自由列表中分配單個連續的內存塊,則請求仍會失敗。