Java Process Status (Ferramenta e Código)

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.

[code]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());

    }

}

[/code]

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.