2008-10-21 26 views
6

Tôi có một đối tượng tĩnh trong thời gian chạy về cơ bản là một danh sách các đối tượng khác (ints, strings, Dictionary, các đối tượng khác, vv). Có cách nào để xác định bộ nhớ được sử dụng bởi đối tượng "danh sách các đối tượng khác" tĩnh của tôi trong thời gian chạy không? Điều này sẽ thuận tiện cho mục đích thiết bị và báo cáo.Dấu chân bộ nhớ của một đối tượng tại Runtime trong .NET là gì?

Trả lời

2

Có thể bạn đang yêu cầu thứ gì đó mà bạn có thể gọi từ mã của mình (mà tôi cũng muốn biết), nhưng tôi cảm thấy tôi nên đề cập đến Ants profiler [http://www.red-gate.com/Products/ants_profiler/index.htm] trong trường hợp người khác không tìm kiếm thứ gì đó cụ thể. Nó sẽ cho bạn biết tất cả các loại thông tin về mã của bạn trong khi nó thực hiện bao gồm cả bộ nhớ đang được sử dụng bao nhiêu.

Từ trang web của họ ...

Sơ bộ nhớ để hiểu làm thế nào ứng dụng của bạn sử dụng bộ nhớ, và để xác định vị trí rò rỉ bộ nhớ. Bộ nhớ bộ nhớ cho phép bạn chụp nhanh tại bất kỳ điểm nào trong việc thực hiện chương trình của bạn, vì vậy bạn có thể xem bộ nhớ nào là khi sử dụng tại thời điểm đó. Bạn có thể chụp nhiều ảnh chụp nhanh tại các thời điểm khác nhau trong khi ứng dụng của bạn đang chạy, vì vậy bạn có thể so sánh bộ nhớ ứng dụng .

+0

Tôi thực sự đang tìm kiếm một thực thi có lập trình. Nhưng tôi đồng ý rằng ANTS Profiler chắc chắn có thể tiện dụng trong các tình huống phù hợp :) – Bullines

3

sizeof có thể được sử dụng trên các loại giá trị cũng có Marshal.SizeOf mà có thể được sử dụng với một số gợi ý để NET:

http://www.pixelicious.net/2008/07/03/exception-trying-to-get-the-size-of-a-c-class-using-marshalsizeof

... Nhưng đó không phải là chính xác tổng số chi phí kể từ khi thời gian chạy không phân bổ thêm byte cho các lớp học cho những thứ như khối đồng bộ.

Nếu bạn đang thực sự quan tâm đến việc đo kiểu này mà, tuy nhiên, bạn nên sử dụng các API profiling:

http://msdn.microsoft.com/en-us/library/ms404386.aspx

Hoặc một công cụ miễn phí như windbg có thể làm tất cả các loại điều tuyệt vời.

1

Không có hồ sơ. Chỉ đủ cho một lớp duy nhất - xem here.

2

Thử thư viện gỡ lỗi SOS. Nó là tốt nhất có. Các bài viết herehere

0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng kế hoạch tấn công ban đầu của tôi, bởi vì tôi chắc chắn hầu hết các đối tượng sẽ được tuần tự hóa, sẽ giống như sau:

using (MemoryStream memstream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    try 
    { 
     formatter.Serialize(memstream, myObjectOfObjects); 
     mem_footprint += memstream.Length; 
    } 
    catch 
    { 
     // not a serializable object 
    } 
} 
Các vấn đề liên quan