Đố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;
}
Nguồn
2012-06-20 19:50:46
Ý 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
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. –
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'. –