2011-01-30 70 views
3

我在運行時將幾個外部程序集加載到我的應用程序中。我需要限制每個外部程序集中定義的特定類可以使用的內存量,例如,每個實例爲10 MB,否則我們將獲得OutOfMemory。如何限制可以由特定類分配的內存?

我用google搜索了什麼是最好的方法來做到這一點,並找到了一些關於CLR Runtime Hosting的信息。這似乎是我需要的東西,但我找不到任何好的例子。

任何人都可以共享代碼或使用CLR運行時主機的內存管理鏈接的例子嗎? 或者也許有更好的解決方案來限制每個類的內存量?

在此先感謝。

+0

這是一個有趣的話題。但是,請您詳細說明一下*爲什麼按每個班級計算*?也許還有其他一些明顯的解決方案,如果你從類實例中釋放你的想法。 – 2011-01-30 13:37:48

+0

事實上,按每個班級來限制並不那麼重要。一類精確類型是我要實例化的唯一東西,這就是爲什麼我的思想與類實例'鎖定':)。我可以做到這一點,例如,在AppDomain中(在AppDomain中創建每個實例),但我找不到限制每個AppDomain存儲器的方法:(我的目標是限制某種可用於「外部開發者' – Andrey 2011-01-30 13:48:00

回答

4

這不是您可以通過CLR Hosting完成的任務。如果您託管CLR,則可以滿足從GC到Windows的分配要求,例如,所以它不是使用VirtualAlloc,而是使用其他一些分配器。但是,每次分配對象時都不會調用主機(這會太昂貴)。

理論上,您可以通過使用CLR分析API來完成此操作。它確實允許您在分配對象時接收回調。

但是,我害怕,你試圖從錯誤的角度來看待這個問題。您可以嘗試將這些外部程序集分離爲單獨的進程,而不是限制類的實例所使用的內存量,而不是限制它們使用Win32作業對象API?

+0

從理論上講,可能有數百個這樣的程序集,它們存在着某種交互作用,這就是爲什麼我害怕將它們分離成一個獨立的進程,但是當然,如​​果沒有更多的選項來限制內存除了每個進程,我沒有選擇:)謝謝你的迴應 – Andrey 2011-01-30 12:48:48