2010-09-27 49 views
13

Làm thế nào tôi có thể nhận được bộ nhớ thực tế được sử dụng trong ứng dụng C# của tôi?Sử dụng bộ nhớ C#

  • Task Manager hiển thị các số liệu khác nhau.
  • Process Explorer cho thấy việc sử dụng tăng byte riêng tư.
  • Bộ đếm hiệu suất (perfmon.msc) hiển thị các số liệu khác nhau
  • khi tôi sử dụng bộ nhớ .NET profiler, nó cho thấy phần lớn bộ nhớ là rác được thu thập và chỉ vài byte trực tiếp.

Tôi không biết nên tin điều gì.

Trả lời

11

Việc sử dụng bộ nhớ có phần phức tạp hơn hiển thị một hoặc hai số. Tôi đề nghị bạn hãy xem Mark Russinovich's excellent post trên các loại bộ đếm khác nhau trong Windows.

.NET chỉ phức tạp hơn nữa. Một tiến trình .NET chỉ là một tiến trình Windows khác, vì vậy rõ ràng nó sẽ có tất cả các chỉ số thông thường, nhưng ngoài ra CLR hoạt động như một trình quản lý bộ nhớ cho ứng dụng được quản lý. Vì vậy, tùy thuộc vào quan điểm những con số này sẽ thay đổi.

CLR phân bổ và giải phóng bộ nhớ ảo một cách hiệu quả trong các khối lớn thay mặt cho ứng dụng .NET và sau đó đưa ra các bit bộ nhớ cho ứng dụng khi cần thiết. Vì vậy, trong khi ứng dụng của bạn có thể sử dụng rất ít bộ nhớ tại một thời điểm nhất định thì bộ nhớ này có thể có hoặc không được tiết lộ cho hệ điều hành.

Trên hết, bản thân CLR sử dụng bộ nhớ để tải IL, biên dịch IL thành mã gốc, lưu trữ tất cả thông tin loại và vv. Tất cả điều này thêm vào bộ nhớ của quá trình.

Nếu bạn muốn biết dung lượng bộ nhớ mà ứng dụng được quản lý của bạn sử dụng cho dữ liệu, thì Byte trong tất cả bộ đếm heap đều hữu ích. Các byte riêng có thể được sử dụng như là một ước tính hơi thô cho việc sử dụng bộ nhớ của ứng dụng ở cấp độ quy trình.

Bạn cũng có thể muốn kiểm tra các câu hỏi liên quan:

Reducing memory usage of .NET applications?

How to detect where a Memory Leak is?

1

Tải VADump (Nếu bạn không có nó chưa)

Cách sử dụng: VADUMP.EXE -sop [PID]

2

Nếu bạn đang sử dụng VS 2010, bạn có thể sử dụng Visual Studio 2010 Profiler. Công cụ này có thể tạo các báo cáo rất thông tin cho bạn.

+0

Hãy nhớ rằng trình hồ sơ chỉ có sẵn trong các phiên bản đắt tiền hơn của VS. –

+0

yes @Brian Rasmussen là đúng. Tôi nghĩ chỉ VS Ultimate hỗ trợ Profiler. –

+0

Bạn cần VS 2010 phí bảo hiểm hoặc cao hơn (đó là lẻ, win7 prof >> home prem trong khi vs2010 prem >> vs2010 prof) – atamanroman

1

Vâng, "bộ nhớ thực tế được sử dụng trong ứng dụng C# của tôi" là gì?

Nhờ bộ nhớ ảo và (một số) lớp quản lý bộ nhớ trong Windows và CLR, đây là một câu hỏi khá phức tạp.

Từ các nguồn bạn đề cập đến trình thu thập thông tin CLR sẽ cung cấp cho bạn chi tiết cụ thể nhất, tôi sẽ gọi đó là chính xác nhất.

Nhưng không có câu trả lời 'số duy nhất', câu hỏi liệu Ứng dụng A có sử dụng nhiều hay ít bộ nhớ hơn B không thể trả lời được.

Vậy bạn thực sự muốn biết điều gì? Bạn có một vấn đề hiệu suất cụ thể để giải quyết?

2

Nếu bạn muốn biết khoảng bao nhiêu byte được phân bổ trên vùng heap GC (bỏ qua bộ nhớ được sử dụng bởi thời gian chạy, trình biên dịch JIT, v.v.), bạn có thể gọi GC.GetTotalMemory. Chúng tôi đã sử dụng điều này khi theo dõi rò rỉ bộ nhớ.

Các vấn đề liên quan