Pular para o conteúdo principal

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

Postagens mais visitadas deste blog

Como gerar scripts para exportar dados no SQL Server 2008

Uma das tarefas mais comuns no trabalho com desenvolvimento de software que consome dados em bancos como o SQL Server 2008 é a necessidade de em algum momento precisarmos exportar os dados de um banco para outro. Quer seja para realizar testes ou fazer simulações existem várias maneiras de se fazer isto. Neste post eu quero demonstrar um recurso do SQL Server Management Studio (SSMS) que permite realizar esta tarefa rapidamente.Para os que estão acostumados a usar esta ferramenta, já devem saber que é possível gerar scripts para o schema e também transferir os dados entre dois bancos distintos. Isto pode ser feito se o SSMS puder conectar-se com as duas bases, de origem e destino. No exemplo que vou dar, o objetivo é gerar o script apenas para uma tabela do banco de dados de exemplo da Microsoft – Northwind.1. Iniciando o assistenteO assistente deve ser iniciado clicando com o botão direito do mouse sobre o banco onde se encontra a tabela a qual iremos gerar o script. Deve se clicar n…

Pivot dinâmico com SQL Server

Passo a passo para usar pivoteamento dinâmicoOs bancos de dados bem configurados e definidos armazenam os dados de forma a otimizar o acesso, evitando duplicidade e garantindo a integridade. Porém, em muitas situações isto pode dificultar a apresentação de forma adequada sendo necessário preparar os dados usando vários recursos entre os quais, fazer o pivoteamento.Se você não precisou ainda usar ou não sabe o que é consiste em transformar cada linha de uma determinada coluna em colunas de uma nova consulta.Assim, considere uma tabela que armazene as notas bimestrais de um boletim. Uma possível estrutura para esta tabela seria algo assim:ColunaTipo de dado/TamanhoDisciplinanvarchar(50)BimestreIntNotanumeric(5,2)Uma consulta select nesta tabela com alguns dados traria um resultado parecido com o abaixo:Porém pode ser que para apresentar estes dados em um relatório seja necessário transformar cada bimestre em uma coluna e agrupar as notas nestas colunas para que fique dessa forma:Isto po…

Desabilitando o auto commit no SSMS (SQL Server Management Studio)

(Ou, como prevenir desastres e manter o emprego a salvo…)Neste post vai uma pequena mas tremendamente útil dica para desabilitar o auto commit da aplicação SQL Server Management Studio (SSMS) que é usada por dez entre dez usuários do banco de dados SQL Server para fazer consultas, alterações e executar scripts no banco de dados. (Preferências à parte, realmente muita gente usa),A primeira e mais importante notícia é que, diferentemente da ferramenta do Oracle, este editor de scripts do SQL Server vem com o recurso de auto commit ativado por padrão, assim, qualquer instrução DML (alteração dos dados com update, insert e delete) ou DDL (alteração no banco como create, drop, alter, etc.) será imediatamente enviada ao banco e persistida.Isto pode ser altamente crítico pois se estiver executando as instruções em um banco de dados de produção não haverá muitas formas de desfazer se é que haverá.Inicialmente, pode se evitar muitos acidades executando estas instruções dentro de um bloco BEGIN…