2008-08-27 42 views
13

Tôi đang cố gắng tìm ra số lượng bộ nhớ mà quy trình máy chủ Net của tôi đang sử dụng (cho mục đích theo dõi và ghi nhật ký).Quy trình Kích thước bộ nhớ - Các bộ đếm khác nhau

Tôi đang sử dụng:

Process.GetCurrentProcess().PrivateMemorySize64 

Tuy nhiên, đối tượng Process có các đặc tính khác nhau cho phép tôi đọc các không gian bộ nhớ sử dụng: Paged, Nonpaged, PagedSystem, NonPagedSystem, tư nhân, ảo, WorkingSet

và sau đó là "đỉnh": mà tôi đoán chỉ lưu trữ các giá trị tối đa mà những cái cuối cùng đã từng sử dụng.

Đọc qua định nghĩa MSDN của từng thuộc tính không chứng minh được quá hữu ích đối với tôi. Tôi phải thừa nhận kiến ​​thức của mình về cách quản lý bộ nhớ (theo phân trang và ảo) rất hạn chế.

Vì vậy, câu hỏi của tôi rõ ràng là "tôi nên sử dụng câu hỏi nào?" Và tôi biết câu trả lời là "nó phụ thuộc".

Quá trình này về cơ bản sẽ giữ một loạt các danh sách trong bộ nhớ của những điều đang diễn ra, trong khi các quá trình khác liên lạc với nó và truy vấn nó cho các công cụ. Tôi hy vọng các máy chủ nơi này sẽ chạy trên để đòi hỏi rất nhiều RAM, và vì vậy tôi đang truy vấn dữ liệu này theo thời gian để có thể ước tính yêu cầu RAM khi so sánh với kích thước của danh sách nó giữ bên trong.

Vậy ... Tôi nên sử dụng cái nào và tại sao?

Trả lời

14

Nếu bạn muốn biết có bao nhiêu GC sử dụng thử:

GC.GetTotalMemory(true) 

Nếu bạn muốn biết những gì quá trình bạn sử dụng từ Windows (Kích cột VM trong TaskManager) thử:

Process.GetCurrentProcess().PrivateMemorySize64 

Nếu bạn muốn biết quy trình của bạn có trong RAM (như trái ngược với pagefile) (Cột Sử dụng Mem trong TaskManager) hãy thử:

Process.GetCurrentProcess().WorkingSet64 

Xem here để được giải thích thêm về các loại bộ nhớ khác nhau.

0

Bộ làm việc không phải là tài sản tốt để sử dụng. Từ những gì tôi thu thập, nó bao gồm tất cả mọi thứ mà quy trình có thể chạm vào, ngay cả các thư viện được chia sẻ bởi một số quy trình, vì vậy bạn sẽ thấy các byte được tính hai lần trong bộ đếm đó. Bộ nhớ riêng là một bộ đếm tốt hơn nhiều để xem xét.

4

OK, tôi tìm thấy thông qua Google cùng một trang mà Lars đã đề cập, và tôi tin rằng đó là một lời giải thích tuyệt vời cho những người không biết cách hoạt động của bộ nhớ (như tôi).

http://shsc.info/WindowsMemoryManagement

kết luận ngắn của tôi là:

  • Private Bytes = The Memory quá trình tôi đã yêu cầu lưu trữ dữ liệu. Một số của nó có thể được phân trang vào đĩa hay không. Đây là thông tin tôi đang tìm kiếm.

  • Byte ảo = Byte riêng tư, cộng với không gian được chia sẻ với các quy trình khác cho DLL được tải, v.v.

  • Bộ làm việc = Phần TẤT CẢ bộ nhớ của quy trình của tôi chưa được phân trang vào đĩa. Vì vậy, số tiền paged vào đĩa nên được (Virtual - Working Set).

Cảm ơn sự giúp đỡ của bạn!

0

Tôi cũng khuyên bạn nên theo dõi mức độ thường xuyên xảy ra sự cố trang. Một lỗi trang xảy ra khi bạn cố truy cập một số dữ liệu đã được chuyển từ bộ nhớ vật lý sang tệp hoán đổi và hệ thống phải đọc trang từ đĩa trước khi bạn có thể truy cập dữ liệu này.

5

Nếu bạn muốn sử dụng "Bộ nhớ (Bộ làm việc riêng tư)" như được hiển thị trong trình quản lý tác vụ Windows Vista, tương đương với Process Explorer "WS Private Bytes", đây là mã. Có lẽ tốt nhất để ném vòng lặp vô hạn này trong một nhiệm vụ luồng/nền cho số liệu thống kê thời gian thực.

using System.Threading; 
using System.Diagnostics; 

//namespace...class...method 

Process thisProc = Process.GetCurrentProcess(); 
PerformanceCounter PC = new PerformanceCounter(); 

PC.CategoryName = "Process"; 
PC.CounterName = "Working Set - Private"; 
PC.InstanceName = thisProc.ProcessName; 

while (true) 
{ 
String privMemory = (PC.NextValue()/1000).ToString()+"KB (Private Bytes)"; 
//Do something with string privMemory 

Thread.Sleep(1000); 
} 
2

Để nhận được giá trị mà Trình quản lý tác vụ đưa ra, mũ của tôi được giải quyết theo cách của Mike Regan ở trên. Tuy nhiên, một thay đổi: không phải là: perfCounter.NextValue()/1000; nhưng perfCounter.NextValue()/1024; (tức là kilobyte thực). Điều này mang lại giá trị chính xác mà bạn nhìn thấy trong Trình quản lý tác vụ.

Sau đây là giải pháp đầy đủ để hiển thị 'sử dụng bộ nhớ' (Trình quản lý tác vụ), theo cách đơn giản trong ứng dụng WPF hoặc WinForms của bạn (trong trường hợp này, chỉ đơn giản là trong tiêu đề). Chỉ cần gọi phương thức này trong hàm tạo cửa sổ mới:

private void DisplayMemoryUsageInTitleAsync() 
    { 
     origWindowTitle = this.Title; // set WinForms or WPF Window Title to field 
     BackgroundWorker wrkr = new BackgroundWorker(); 
     wrkr.WorkerReportsProgress = true; 

     wrkr.DoWork += (object sender, DoWorkEventArgs e) => { 
      Process currProcess = Process.GetCurrentProcess(); 
      PerformanceCounter perfCntr = new PerformanceCounter(); 
      perfCntr.CategoryName = "Process"; 
      perfCntr.CounterName = "Working Set - Private"; 
      perfCntr.InstanceName = currProcess.ProcessName; 

      while (true) 
      { 
       int value = (int)perfCntr.NextValue()/1024; 
       string privateMemoryStr = value.ToString("n0") + "KB [Private Bytes]"; 
       wrkr.ReportProgress(0, privateMemoryStr); 
       Thread.Sleep(1000); 
      } 
     }; 

     wrkr.ProgressChanged += (object sender, ProgressChangedEventArgs e) => { 
      string val = e.UserState as string; 
      if (!string.IsNullOrEmpty(val)) 
       this.Title = string.Format(@"{0} ({1})", origWindowTitle, val); 
     }; 

     wrkr.RunWorkerAsync(); 
    }` 
+1

Đây là cách chính xác nhất mà tôi đã gặp. Tôi muốn khớp với những gì người quản lý công việc đang hiển thị. – Andez

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