MEMUSG

Como inspecionar o total de memória usada por um programa com C#


English version
Sou um cara paranoico no que diz respeito a usar computador.
Não estou satisfeito com os programas atuais, muito menos com o consumo de memória destes. Recentemente, fiquei maluco quando o sistema começou a ficar lerdo e fui ver que o meu browser estava consumindo mais de 3GB de memória. Detalhe: havia apenas 4 abas abertas!
Mas, tirando essa maluquice, também preciso periodicamente inspecionar o desempenho de algumas das aplicações no meu trabalho e estava sentindo necessidade de obter um resumo do consumo de memória.
Por exemplo, em algumas versões do Windows não há uma forma resumida de se exibir quanto de memória o Chrome está consumindo.
Se você usar o Gerenciador de Tarefas, no primeiro plano verá pouca memória sendo usada e um item na lista apenas, mas, ao percorrer a lista verá que há muito mais processos com o nome do Chrome e cada um com mais consumo de memória.

Resolvi fazer uma pesquisa e tentar criar um aplicativo console no qual eu enviava o nome do processo que queria inspecionar e este me mostrasse o total de memória que estava sendo consumido. O link para o artigo do qual este foi baseado está no final.

O objetivo é que você possa no prompt de comando executar o comando e passar como argumento o nome de um processo ou programa que deseja inspecionar a memória privada, ou seja, que está sendo usada exclusivamente por este.

No código abaixo demonstro como ficou a aplicação memusg.cs.

using System; using System.Diagnostics; public static class memusg { static void Main(string[] args) { if(args == null || args.Length == 0) { Console.WriteLine("Usage: memusg <process name>"); return; } getallmemoryusage(args[0]); } private static void getallmemoryusage(string pName) { double f = 1024.0; Process[] localByName = Process.GetProcessesByName(pName.ToLower()); decimal max = 0m; foreach (Process p in localByName) { max += (decimal)(p.PrivateMemorySize64 / f / f); } Console.WriteLine("Total private memory usage: {0:N0} MB", max); } }

Como objetivos este código procura pelo processo ou programa passado como argumento e faz a soma do consumo de memória (em MB) de todos os processos com o mesmo nome, imprimindo no console o valor final.

Esta funcionalidade está implementada no método getallmemoryusage() que precisa receber como argumento o nome do processo.

Inicialmente, para tornar o total de memória expresso em MegaBytes, é criado um objeto do tipo double para a divisão do valor total encontrado.

O objeto localByName armazena a lista de processos obtida pela classe Process. Observe que para usar esta classe está sendo referenciado o namespace System.Diagnostics.

Por fim, com um loop, a lista de processos é percorrida procurando por todos os que tem o nome passado por argumento para somar o valor da memória em “max”. O valor já é armazenado como MB. Note a divisão por 1024 por duas vezes, já que na lista o valor da memória está expresso em bytes.

E você? Qual a sua paranoia com os sistemas atuais?

Links
  1. Post Original no MSDN
  2. Classe System.Diagnostics.Process