Classe Runtime

A classe Runtime é utilizada para se comunicar com o ambiente que a JVM está executando. Por exemplo: utilizamos ela para carregar DLLs (Windows) ou SOs (Linux), através do método load. Cada aplicação Java possui uma única instância e podemos obter essa instância através do método estático getRuntime(). A seguir temos um exemplo de alguns métodos bem bacanas dessa classe:

[sourcecode language=”java” highlight=”15,41,46,47,48,52″]
package br.com.thiagovespa.system.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SystemInfo {

public static String execute(String command) {
String s;
StringBuilder result = new StringBuilder();
BufferedReader stdInput = null;

try {
Process p = Runtime.getRuntime().exec(command);
stdInput = new BufferedReader(new InputStreamReader(
p.getInputStream()));

while ((s = stdInput.readLine()) != null) {
result.append(s).append("\n");
}

} catch (IOException e) {
e.printStackTrace();
} finally {
if (stdInput != null) {
try {
stdInput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}

public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();

System.out.println("Número de processadores disponíveis: "
+ rt.availableProcessors() + " \n");

System.out.println(execute("free"));

System.out.println("Memória disponível na JVM antes do GC: "
+ rt.freeMemory() + " bytes de " + rt.totalMemory()
+ " bytes – Máximo: " + rt.maxMemory() + " bytes");
rt.gc();
System.out.println("Memória disponível na JVM após o GC: "
+ rt.freeMemory() + " bytes de " + rt.totalMemory()
+ " bytes – Máximo: " + rt.maxMemory() + " bytes");
rt.exit(0);

}

}

[/sourcecode]

Na linha 15 executamos um comando ou aplicativo externo. Para isso criei um método a parte. O exec possui várias sobrecargas podendo ser executado passando parâmetros, com variáveis de ambiente, entre outros. Nesse exemplo, ele executa o comando free do linux, e armazeno em uma String para exibir a quantidade de memória livre do sistema operacional. Esse mesmo código pode ser utilizado para executar qualquer comando ou aplicativo externo à uma aplicação Java. Existe a possibilidade de recuperar o stream de entrada, de saída e de erro para poder manipular o comando/aplicativo.

Na linha 41, tem um método interessante, que recupera a quantidade de processadores disponível para a máquina virtual. Esse recurso pode ser útil  no desenvolvimento de programas que executem código paralelo. Nas linhas 46 e 47, consigo monitorar a quantidade de memória livre, total e máxima alocada no momento para a aplicação Java.

A linha 48 é responsável por solicitar à JVM a execução do Garbage Collector para liberação de memória não referenciada. Pela especificação essa execução não é garantida, ao chamar esse método ele apenas sugere a execução. Uma outra forma de se chamar é pela classe System (System.gc()). Na linha 52 eu finalizo o programa com o código 0 (sem erro). Essa chamada não é necessária, mas ilustra um dos métodos da classe Runtime.

A saída desse programa é a seguinte:

[sourcecode]
Número de processadores disponíveis: 4

total used free shared buffers cached
Mem: 8193120 6553088 1640032 0 554160 2031860
-/+ buffers/cache: 3967068 4226052
Swap: 8193144 0 8193144

Memória disponível na JVM antes do GC: 124384688 bytes de 125698048 bytes – Máximo: 1866006528 bytes
Memória disponível na JVM após o GC: 124902352 bytes de 125698048 bytes – Máximo: 1866006528 bytes
[/sourcecode]

Dessa maneira você pode ter um controle maior sobre sua aplicação e executar programas externos.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6