2009-06-21 50 views
3

我有一個應用程序(winform exe),我運行了好幾次。這是否意味着我有共享程序集或每個實例都有它自己的程序集副本?當我運行應用程序時,它使用大約30MB(在任務管理器中),當我運行另一個應用程序副本時,它使用另一個30MB。共享內存和運行可執行文件的多個副本

如何計算出使用的內存量,以及如果我能夠減少內存過度使用(如果我運行多個實例)?法律顧問

Regards JD。

+0

它是靜態的還是二聯的? – 2009-06-21 14:57:01

回答

4

這很複雜。

首先閱讀我最近關於虛擬內存的文章。

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

好了,現在你有虛擬內存是如何工作的一些瞭解,你可以瞭解如何在操作系統加載DLL文件到內存中。假設你有兩個進程都需要特定頁面的Foo.DLL。操作系統會將該頁面加載到物理內存中,然後將該物理頁面映射到這兩個進程的虛擬空間中。所以正在使用的物理內存量是4KB頁面。但是這4KB顯示在兩個進程中。 30MB大部分可能是共享物理內存。

找出的方法是關於您使用任務管理器更復雜。你想在那裏添加一些列並查看「Working Set」和「Private Working Set」。 「工作集」是該進程當前正在使用的頁面的總數,私有和共享。 「私人工作集」是不共享的人數。

要降低您的內存使用率 - 首先,請先了解您關心的原因。機器最近有很多內存,而30MB的內存相對較少。除非你能找到一個引人注目的以客戶爲中心的理由來解決這個問題,然後再去做別的事情,比如讓你的程序更快或者增加更多的功能。假設您有理由關心,請自己準備一些工具 - 特別是內存分析器。 .NET內存分析器可以告訴你所有分配的位置以及它們的大小。

0

當您發現運行應用程序的第二個副本使用另一個30MB內存時,我認爲您已經回答了您自己的問題。

應用程序的每個實例都將在其自己的進程空間中運行,並且不會與任何其他應用程序實例共享內存或非文件資源。

不知道你的應用程序做了什麼,我能想到的(目前)減少內存使用量的唯一方法就是將數據寫入磁盤。這會釋放內存,因爲這些對象超出了範圍 - 但是當您從磁盤讀取數據時顯然會被重用。

+0

感謝Chris的快速回復。 如何在GAC中註冊使用的組件?這會有幫助嗎? – 2009-06-21 14:05:08

+0

我不這麼認爲 - 但我並沒有真正鑽研GAC,因爲我沒有必要,所以我不能肯定地說。 – ChrisF 2009-06-21 14:09:18

1

如果您沒有靜態資源,則可以不使用第二個進程而是在應用程序啓動並且其實例已存在的情況下添加一個新線程。這就是Firefox所做的。

相關問題