Java Process Status (Ferramenta e Código)

0 respostas
X

Olá Galera,

Seguindo um conselho do meu amigo Gabriel Massote, resolvi dar as caras por aqui também e postar conteúdos.
Espero que sirvam de alguma coisa.

Primeiramente, vou falar um pouco do Java Process Status Tool ou simplesmente JPS.

O JPS é uma ferramenta que permite listar todos os processos (nomes das classes que contém o método main) Java atualmente em execução na Java Virtual Machine. A ferramenta é encontrada na pasta bin do JDK 5 e posteriores (Exemplo: C:\Arquivos de programas\jdk1.6.0\bin).

Para utilizar a ferramenta precisamos abrir o prompt de comando do windows ou terminal do linux e navegar até a pasta bin (comando cd). Apartir daí é só digitar o comando jps e verificar os resultados.

Exemplo:

C:\Arquivos de programas\jdk1.6.0\bin> jps
30286 Jps
30271 Main

Opções do comando:

- l : (L) Retorna o PID do processo e o nome completo da classe que está sendo executada.

Exemplo:

C:\Arquivos de programas\jdk1.6.0\bin> jps -l
30456 sun.tools.jps.Jps
30271 org.netbeans.Main

- m : Retorna o PID do processo, o nome e os parâmetros que foram passados para a classe que está em execução.

Exemplo:

C:\Arquivos de programas\jdk1.6.0\bin> jps -m
30529 Main -c
30664 Jps -m

Estas opções também podem ser utilizadas em conjunto (Ex: jps -lm). Mais opções podem ser encontradas na documentação do JPS.

Entendidos os conceitos da JPS, agora veremos como utilizar as classes Monitored.

Primeiramente devemos fazer uma pequena gambiarra importar para o classpath o jar tools.jar (disponível no JDK 1.5 ou posterior, na pasta lib).
Exemplo: C:\Arquivos de programas\Java\jdk1.6.0\lib

Utilizaremos o código abaixo, feito por mim, para entendermos como funciona as classes.
O código está comentado de forma que está fácil de entender.

import java.util.Set;

import java.net.URISyntaxException;

import java.util.ArrayList;

import java.util.HashSet;

import sun.jvmstat.monitor.MonitorException;

import sun.jvmstat.monitor.MonitoredHost;

import sun.jvmstat.monitor.MonitoredVm;

import sun.jvmstat.monitor.MonitoredVmUtil;

import sun.jvmstat.monitor.VmIdentifier;

 

public void getJVMProcesses(){

        try {

            //Define qual máquina será monitorada, no nosso caso a máquina local

            MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");

            //Armazena no Hash os processos da maquina virtual

            Set vmlist = new HashSet(local.activeVms());

            //Executa enquanto houverem processos, fazendo com que um Object receba um id de cada um

            for (Object id : vmlist){

                //Configura qual processo será monitorado, no caso, o indicado pelo Object "id"

                MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + id));

                //Mostra somente o nome da classe main do processo

                System.out.println(MonitoredVmUtil.mainClass(vm, false));

                //Mostra o nome completo da classe main do processo (com nomes dos pacotes)

                System.out.println(MonitoredVmUtil.mainClass(vm, true));

            }

            //Excessões disparadas pelas classes Monitored

        } catch (MonitorException ex) {

            log.error("Erro na monitoração da JVM. \nErro: "+ex.getMessage());

        } catch (URISyntaxException ex) {

            log.error("Erro na busca do host para monitoração da JVM. \nErro: "+ex.getMessage());

        }

    }

Neste código está presente somente a função e as bibliotecas necessárias para o seu funcionamento, de modo que é necessário a construção de um main ou qualquer outro método para a invocação deste.

OBS: Como importamos de um pacote não público da Sun, pode ser que apareçam alguns warnings com a mensagem de forbidden package, se você necessita resolver isso, baixe o openJDK e importe o mesmo arquivo tools.jar.

Como é meu primeiro post, qualquer sugestão de modificação será bem vinda!

Qualquer dúvida, crie seu comentário que tentaremos ajudar!

Abraços a todos!

Gustavo.

Criado 29 de setembro de 2008
Respostas 0
Participantes 1