Criar um visualizador de memória em uso! Alguém conhece o caminho?
5 respostas
Zakim
Bom dia a todos.
Preciso criar um visualizador de memória que mostre dentro da minha aplicação, quanto de memória está sendo consumido para
a pelo programa.
Acredito que deve existir algum comando milagroso que me faça boa parte do serviço. Alguém o conhece? Caso não exista , poderiam me dar algumas dicas de como posso construir um?
Dê uma olhada na classe Runtime, ela tem alguns métodos que podem te ajudar.
Exemplo de código que escrevi para alguns testes:
publicstaticvoidmain(Stringargs[]){Runtimert=Runtime.getRuntime();System.out.println("Memória livre "+rt.freeMemory());System.out.println("Máximo memória: "+rt.maxMemory());System.out.println("Número de processadores: "+rt.availableProcessors());}
Zakim
valeu davidtiagoconceicao.
obrigado!
davidtiagoconceicao
Opa, de nada.
Não sei se era essa a classe milagrosa que você esperava, mas tudo bem. uahauha
Dúvidas poste aí.
Valeu!
ViniGodoy
Aqui está a classe que criamos aqui na empresa para isso. Ela nada mais é que uma barra de progresso, que mostra a quantidade de memória disponível e utilizada.
Ela ainda possui um listener, caso vc queira ouvir que a memória está abaixo de um determinado limite (útil para logs).
importjava.awt.EventQueue;importjava.util.ArrayList;importjava.util.List;importjavax.swing.JProgressBar;publicclassMemoryBarextendsJProgressBar{finalintMAX_MEGA=(int)((float)Runtime.getRuntime().maxMemory()/1048576);privateintlowMemory=10;privateThreadthread=null;privatefinalMemoryReaderreader=newMemoryReader();privateList<MemoryBarListener>listeners=newArrayList<MemoryBarListener>();publicMemoryBar(){setMaximum(100);setStringPainted(true);setString("");start();}/** * Sets the low memory limit. Below that, low memory events will be fired. * * @param lowMemory Memory limit, in megabytes. */publicvoidsetLowMemory(intlowMemory){this.lowMemory=lowMemory;}/** * Sets the low memory percent, relative to the maximum memory. Below that, * low memory events will be fired. * * @param lowMemory Memory limit, in megabytes. */publicvoidsetLowMemoryPercent(doublelowMemory){this.lowMemory=(int)(MAX_MEGA*lowMemory/100);}publicvoidstart(){if(thread!=null)return;thread=newThread(reader,"Memory bar thread");thread.setDaemon(true);thread.start();}publicvoidstop(){if(thread==null)return;thread.interrupt();thread=null;}publicsynchronizedvoidaddListener(MemoryBarListenerlistener){listeners.add(listener);}publicsynchronizedvoidremoveListener(MemoryBarListenerlistener){listeners.remove(listener);}privatesynchronizedvoidfireLowMemory(doubleusedMega){LowMemoryEventlme=newLowMemoryEvent(this,usedMega,MAX_MEGA);for(MemoryBarListenerlistener:listeners)listener.lowMemory(lme);}privateclassMemoryReaderimplementsRunnable{publicvoidrun(){try{while(!Thread.interrupted()){longtotal=Runtime.getRuntime().totalMemory();longfree=Runtime.getRuntime().freeMemory();doubleusedMega=(total-free)/1048576.0;updateBar(usedMega);if(MAX_MEGA-usedMega<lowMemory)fireLowMemory(usedMega);Thread.sleep(1000);}}catch(InterruptedExceptione){}}privatevoidupdateBar(finaldoubleusedMega){EventQueue.invokeLater(newRunnable(){publicvoidrun(){setValue((int)(usedMega*100.0/MAX_MEGA));setString(String.format("%.1fM of %dM",usedMega,MAX_MEGA));}});}}}