2011-06-26 37 views
9

我已經看到類似於這個問題的一些討論,但沒有真正回答我面臨的問題。在.NET中快速檢查或限制線程內存使用情況?

我正在開發一個C#應用程序,其中的軟件行爲可以通過解釋腳本進行定製。每個腳本都在C#應用程序的另一個子線程上運行。 (我使用Jint javascript解釋器來運行腳本,但是我的問題同樣適用於線程在.NET應用程序中可以動態行爲的任何其他情況)。到目前爲止,這工作很好。但是我需要確保應用程序的行爲。如果腳本錯誤可能會導致應用程序用完堆空間,那麼我需要能夠檢測並停止正在消耗太多內存的任何線程。從概念上講,這可能與Web瀏覽器類似,以確定頁面上的JavaScript是否耗時太長或執行的內存太多。麻煩的是,我一直無法確定是否有任何方法可以在.NET中執行此操作。

是否有某種方法可以對線程可以使用的內存量進行硬性限制,或者從父線程快速檢查線程的內存利用率?我不關心線程內的堆棧溢出,只是堆空間。當然,「明顯的」解決方案是將解釋分解爲獨立的進程而不是單獨的線程,但這會對我的應用程序造成顯着的性能下降,因爲這些腳本修改了軟件行爲,因而意圖緊密再加。應用程序級別的監控也不會很理想,因爲它不會提供關於哪些腳本本身不行爲的信息。此外,由於腳本旨在允許快速修改軟件,而不必構建,測試和重新部署,因此用於調試的緩慢方法將無法正常工作。我只需要一些相當快的方法來檢測一個正在吃掉太多內存的線程,這樣我就可以殺死並忽略它的腳本。

謝謝!

+0

「我正在開發一個C#應用程序,其中的軟件行爲可以通過解釋腳本來定製,每個腳本都運行在C#應用程序的不同子線程上。如果你正在做的是定製應用程序。爲什麼腳本需要在不同的線程上運行? –

+0

「,因爲這些腳本修改軟件行爲,因此打算緊密耦合」 - 我聽到緊緊耦合的腳本的話,我開始想知道設計.... –

+0

如果你想限制內存使用,那麼我認爲你使用單獨的流程會更好。如果有某些腳本存在危險,您完全無法控制不玩遊戲,那麼我會確保它在單獨的進程上運行。我不確定你可以限制你想要的每個線程,因爲如果有API可以這樣做,它將是一個Windows API,據我所知,你不能映射託管線程和Windows線程有任何用處。 – InBetween

回答

0

WMI是您的一個選擇。我知道你可以監控進程內存的使用情況。但是你可以更多地探索這個想法。

Here is small intro to WMI in C#。有一整套你可以查詢的類。而對於查詢本地機器統計數據,它不會非常昂貴。但我會建議先拿一些表演數字。

+0

我認爲這種方法的問題是託管線程和窗口線程之間沒有一對一的關係。 – InBetween

3

正如其他海報所示,在一個單獨的過程中託管可能更容易。輕量級的方法是在不同的應用程序域中進行託管,並使用app-domain resource monitoring API來監視內存使用情況。

相關問題