2015-07-10 93 views
0

我正在嘗試測量代碼的內存使用情況,但我不知道如何繼續。 我不想使用「DotMemory」或任何「探查器」,我需要通過編程來完成。如何測量代碼的內存使用情況?

有什麼辦法可以知道分配了多少對象? 像5 INT(4個字節)+ 4對象(16個字節)...

我用

process.WorkingSet64

,但我每次運行相同的代碼,我得到不同的值。

那麼,什麼是衡量一個代碼的內存使用情況的最好方法?

+3

There's一個很好的理由分析工具,如DotMemory成本的錢,收集保留內存的總量是很大的不僅僅是你的程序中計數的任何對象足跡更多。還有一些預留給.NET自己的內存,這是在工作集中考慮的。 – HimBromBeere

+0

但爲什麼,如果我運行相同的代碼,即使我使用DotMemory或CLRprolfiler分配大小是不同的?的 – omega

+1

可能重複的[如何編程測量.NET當前進程的總的內存消耗?](http://stackoverflow.com/questions/2342023/how-to-measure-the-total-memory-consumption-of當前進程編程) –

回答

2

.NET是一個託管內存環境。這意味着分配和取消分配對您來說是透明地處理的,但這也意味着內存使用模式不是完全確定性的。時間

99.9%,這是不是一個問題了。其餘時間,您應該將工作重點放在重要的領域 - 通常,在一個地方處理所有關鍵負載非常容易。

你的問題建議你來自一個C /帕斯卡爾背景 - 託管內存的代價是,你真的shoudln't照顧記憶 - 當然,你要注意不要直接浪費內存,但服用兩次儘可能多的記憶通常不是失眠的原因。 「之前的記憶」和「記憶之後」是一個在多線程環境中確實沒什麼意義的問題 - 您的方法並不是唯一同時運行的方法。

+0

但如果我想知道有多少對象的代碼在methodX創建像()我想知道,5 INT(大小10bytes)+ + 4對象(16個字節)..等等一個自己沒有辦法做到它喜歡使用反射還是其他的東西? – omega

+0

對於這個問題,看看我的文章 –

+0

@omega只有真正的調試器訪問這個。當然,您不能從.NET應用程序實現剖析器/調試器接口。如果您正在調查內存問題,請使用CLRProfiler。如果你需要應用程序本身的實時內存信息*,那麼你正在做一些嚴重錯誤的事情。這不是C/Pascal,你*不應該一直監視內存。這只是你的工作 - 除了分析。 – Luaan

0

簡單和愚蠢:

long total = GC.GetTotalMemory(true); 
+0

這不會顯示代碼的特定部分使用的內存。 –

+2

@EmpereurAiman原始問題沒有這樣的要求。另外,我們可以調用這個方法,然後執行部分代碼,然後再次調用該方法。區別在於這部分代碼的內存消耗。 –

0

正如其他postsyou着的描述只是看你在這個過程中探險家看到的數字。

如果你真的想測量MemoryUsage,可以使用適當的工具,如RedGate Ants ProflerdotMemory。還有更多,但有了這兩個我做了很好的經驗。 他們也向你展示RAM how many instances of each type的和what do hold them alive

List of all instances

的主要問題是什麼是你在找這個原因嗎?你有沒有RAM問題?也許是泄漏? 在搜索問題時,常用的方法是使用上述工具製作快照並對其進行比較。在那裏你可以看到你有越來越多的實例。

要獲得對象的近似值,其大小(例如看到無論您可能會問題),你可以嘗試計算估計看到這個find size of object instanc in bytes in c sharp例如

+0

這不等於使用探查器(因爲OP不想使用)? – BIBD

+0

@boas的,其原因在於,使每一次像單元的存儲器測試我們必須確保代碼消耗相同的內存,以決定是否代碼是好還是不呢? – omega

1

如果您需要以編程方式測量內存消耗,你可以使用dotMemory Unit 當前版本可以通過ReSharper單元測試運行器與單元測試一起使用,但很快將提供帶有獨立運行器的下一個版本。

var mcp1 = dotMemory.Check(); 
methodX(); 
dotMemory.Check(memory => 
{ 
    var newObjects = memory.GetDifference(mcp1).GetNewObjects(); 
    var createdObjectsCount = newObjects.ObjectsCount; 
    var allocatedMemory = newObjects.SizeInBytes; 
}); 

更多詳細信息在blog post

UPDATE:獨立亞軍去EAP https://www.nuget.org/packages/JetBrains.DotMemoryUnit/2.0.20150727.161305-EAP5

+0

OP明確不想使用DotMemory。 – BIBD

+1

@BIBD'dotMemory Unit'不是一個dotMemory。這是一個框架而不是應用程序。 –

+1

我站好了 – BIBD