Muchas veces necesitamos darle más memoria a la maquina virtual de Java para que ejecute ciertas funciones de nuestra aplicación, ya que si no se la damos tenemos el famoso mensaje: “PerGerm Space” ó “head space”. Aunque es necesario revisar esas funciones, ya que tal vez sea por las logica de la programación, se debe optimizar cada sentencia para consumir menos recursos del hardware..entonces en ese caso como el famoso argot popuar el problema no es de “Indio sino de flecha”..es decir el problema no es de la memoria de java, sino de la forma que estan programadas de las funciones.

En otros casos, como me sucedio a mi, el JVM no soportaba una conexión con Postgres para traer solo un millon de registros en un aplicativo de escritorio Java Swing…siempre se quedaba sin memoria, cuando mas o menos iba en el registro 300000 y observe por medio del taskmanager que consumia solo 291 mbs de las 2 gb de RAM de mi equipo (se debe tener en cuenta que mucha de la RAM de nuestros equipos se asigna a cosas como el SO, aplicaciones que se arrancan al inicio como los antivirus, etc.)  y se quedaba colgada la aplicación.

Buscando por alli encontre un articulo que me dio la luz: aumentar el tamaño de memoria de la maquina virtualen java, este buen articulo explica como de forma sencilla podemos dar parametros de inicialización a la maquina virtual de java, ya sea corriendo un JAR, una clase Java ó parametrizando por medio de un script como lo hace Tomcat.

Realize las pruebas por comandos y excelente!! mi aplicativo corrio perfectamente y pude hacer provecho de mi memoria RAM…pero… no podia decirle al cliente: “Siempre que ejecute el aplicativo cuando vaya a traer un millon de registros..entre el cmd o a la terminal y digite java -X256m -Xmx1024 ..etc. etc.”, por ello decidi hacer un .bat que me facilitara esa ejecución.. pero al ejecutarlo queda la pantalla del CMD detras del aplicativo, visible el cual el cliente puede cerrar en cualquier momento ya que tal vez no la quiere ver y con ello cierra el aplicativo y puede obtener perdidas de información o algo así.

Fue por ello que decidi crear un pequeño aplicativo Java que ejecutara el codigo al CMD con los parameros de memoria para la maquina virtual.. y listo!!!!.. se soluciono:  1ro – la necesidad de memoria para mi aplicación JAVA en Swing, 2do – la transparencia de  ejecución para el usuario  y 3ro- presentación para el usuario.(Estos dos ultimos inconevneintes nacieron al momento de ecsoger las opciones de solución)

Dejo el codigo que use para del segundo aplicativo para la ejecución del codigo CMD que ejecutara mi aplicativo Swing:

//extiende de Thread para usar hilos
public class Ejecutable extendsThread {
publicstaticvoidmain(String[] args) {
//instancio mi clase
Ejecutable ejecutable =new Ejecutable();
//ejecuto el hilo
ejecutable.start();
}
publicvoidrun(){
//Defino objeto pr de la clase Procces
 Process pr;
//Hago un string con el comando de consola o terminal
//El System.getProperty("user.dir") es para saber en que directorio esta siendo ejecutada mi clase Ejecución
String comando ="java -Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -jar \""+System.getProperty("user.dir")+"\\nombreJARMiaplicativo.jar \" ";
try{
//Ejecutamos el comando
pr = Runtime.getRuntime().exec(comando);
}
catch(Exception ex)
{
System.out.println("Ha ocurrido un error al ejecutar el comando. Error: "+ex);}
}
}

Espero les sirva.. ya saben lo que dicen..siempre ahi mejor forma d ehacer las cosas..si saben de una mejor me comentan y lo mejoramos!!

Anuncios