2010-04-09 60 views
7

Làm cách nào để tính bộ nhớ làm việc riêng tư bằng C#? Tôi quan tâm đến việc tạo ra cùng một con số giống như taskmgr.exe.Cách tính toán bộ làm việc riêng tư (bộ nhớ)?

Tôi đang sử dụng không gian tên Quy trình và sử dụng các phương pháp/dữ liệu như WorkingSet64PrivateMemorySize64, nhưng các số liệu này giảm đi 100MB hoặc nhiều hơn.

Trả lời

23

Đây là một số có số lượng rất cao, bạn không thể tính toán nó. Trình quản lý bộ nhớ Windows liên tục hoán đổi các trang trong và ngoài RAM. TaskMgr.exe lấy nó từ một bộ đếm hiệu suất. Bạn có thể nhận được cùng một số như sau:

using System; 
using System.Diagnostics; 

class Program { 
    static void Main(string[] args) { 
     string prcName = Process.GetCurrentProcess().ProcessName; 
     var counter = new PerformanceCounter("Process", "Working Set - Private", prcName); 
     Console.WriteLine("{0}K", counter.RawValue/1024); 
     Console.ReadLine(); 
    } 
} 

Hãy cẩn thận rằng số thực sự không có ý nghĩa nhiều, nó sẽ giảm khi các quá trình khác bắt đầu và cạnh tranh cho RAM.

+0

Ý bạn là, "số thực sự không có ý nghĩa nhiều"? Không phải con số này đại diện cho bao nhiêu bộ nhớ mà quá trình sử dụng không thể được chia sẻ với một quá trình khác? Tôi quan tâm đến việc xây dựng một dịch vụ sẽ giết quá trình "lạm dụng" quy trình - "lạm dụng" được định nghĩa là các quá trình sử dụng nhiều hơn x nhiều MB bộ nhớ. Tôi ghét phải viết dịch vụ nếu con số tôi đang sử dụng thực sự không có ý nghĩa nhiều. Bạn sẽ đề xuất điều gì? – sholsapp

+0

Không, đó không phải là ý nghĩa của số. Bạn đang tìm kiếm "Private Bytes", số lượng bộ nhớ * ảo * được thực hiện bởi một quá trình không thể được chia sẻ bởi các quá trình khác. –

+7

Trong khi tất cả được nói là chính xác, tôi muốn thêm, mà chỉ sử dụng 'ProcessName' để tra cứu cá thể truy cập phù hợp là không đủ. Nếu bạn có nhiều quy trình với cùng một quy trình (ví dụ svchost.exe) thì tên truy cập sẽ là "svchost # 1", "svchost # 2", v.v. Bạn cần phải khớp thông qua bộ đếm "Quy trình ID", cũng là phần của danh mục quy trình và 'Process.ID'. –

0

Đối với người dùng trong tương lai, dưới đây là những gì tôi phải làm để đảm bảo có được Bộ làm việc riêng cho các quy trình có thể có nhiều phiên bản. Tôi gọi số CurrentMemoryUsage, có tên quy trình thích hợp từ GetNameToUseForMemory. Tôi tìm thấy vòng lặp này chậm, ngay cả khi lọc kết quả mà tôi có thể. Vì vậy, đó là lý do tại sao bạn thấy GetNameToUseForMemory sử dụng từ điển để lưu vào bộ nhớ đệm tên.

private static long CurrentMemoryUsage(Process proc) 
{ 
    long currentMemoryUsage; 
    var nameToUseForMemory = GetNameToUseForMemory(proc); 
    using (var procPerfCounter = new PerformanceCounter("Process", "Working Set - Private", nameToUseForMemory)) 
    { 
    //KB is standard 
    currentMemoryUsage = procPerfCounter.RawValue/1024; 
    } 
    return currentMemoryUsage; 
} 

private static string GetNameToUseForMemory(Process proc) 
{ 
    if (processId2MemoryProcessName.ContainsKey(proc.Id)) 
    return processId2MemoryProcessName[proc.Id]; 
    var nameToUseForMemory = String.Empty; 
    var category = new PerformanceCounterCategory("Process"); 
    var instanceNames = category.GetInstanceNames().Where(x => x.Contains(proc.ProcessName)); 
    foreach (var instanceName in instanceNames) 
    { 
    using (var performanceCounter = new PerformanceCounter("Process", "ID Process", instanceName, true)) 
    { 
     if (performanceCounter.RawValue != proc.Id) 
     continue; 
     nameToUseForMemory = instanceName; 
     break; 
    } 
    } 
    if(!processId2MemoryProcessName.ContainsKey(proc.Id)) 
    processId2MemoryProcessName.Add(proc.Id, nameToUseForMemory); 
    return nameToUseForMemory; 
} 
+0

Lưu ý rằng bộ nhớ đệm giá trị sẽ không hoạt động, vì quá trình "cũ hơn" có thể tắt và instanceName được "nhập lại" http://blogs.technet.com/b/askperf/archive/2010/03/30/perfmon -xác định-quy trình-by-pid-thay-of-instance.aspx – Andre

+0

@Và bạn đang đúng! tks –

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