Inicio > java, kodegeek, oracle, programación > Opciones útiles de la máquina virtual de Java

Opciones útiles de la máquina virtual de Java

Miércoles, 15 de septiembre de 2010

Bueno, está página es super conocida para quienes usan la máquina virtual de Java por parte de Oracle.

Yo en particular corro procesos los cuales pasan largo tiempo haciendo cosas durante el día. Una de las cosas que quiero que hagan es que si se mueren me digan porqué. En especial uno de los errores más difíciles de capturar son los de “OutOfMemory” (quedarse sin memoria) ya que en muchos casos la aplicación queda en un estado inconsistente; La recomendación dice que si se queda sin memoria es mejor matar a la aplicación, aunque muchas veces es imposible cambiar el código para hacerlo de manera limpia, por lo que este truco seguro le vendrá a la mano.

Pero primero, nuestro programa el cual se va a quedar sin memoria:

1
2
3
4
5
6
7
package com.kodegeek.blog;
public class RunOutOfMemory {
        public static void main(String [] args) {
                long [] array = new long[Integer.MAX_VALUE];
                System.out.println("Mi arreglo tiene un tamaño de: " + array.length);
        }
}

El programa es un poco artificial, en especial si podemos pedir suficiente memoria con parámetros como ‘-XmsXXXXm -XmxXXXXm’, pero ilustra un caso en que no podemos reservar suficiente memoria:

1
2
3
4
5
6
7
8
9
auyan:~ josevnz$ java -classpath . com.kodegeek.blog.RunOutOfMemory
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.kodegeek.blog.RunOutOfMemory.main(RunOutOfMemory.java:7)
auyan:~ josevnz$ echo $?
1
if [ $? != 0 ]; then
    echo "Mi programa se quedó sin memoria en $HOSTNAME"|mail kodegeek@kodegeek.com
fi
auyan:~ josevnz$

Un poco complicado, además de que si el programa se queda guindado (es decir la máquina virtual nunca termina) entonces nunca sabremos que fué lo que paso :(

¿Y como nos enteramos de que murió, por ejemplo recibiendo un correo electrónico? Bueno, es sólo cuestión de agregar unos cuantos parámetros:

1
2
3
4
5
6
7
8
9
auyan:~ josevnz$ java -classpath . -XX:OnOutOfMemoryError="echo 'Me quede sin memoria en $HOSTNAME'|mail jose.nunez@gmail.com; kill -9 %p" com.kodegeek.blog.RunOutOfMemory
#
# java.lang.OutOfMemoryError: Requested array size exceeds VM limit
# -XX:OnOutOfMemoryError="echo 'Me quede sin memoria en auyan.local'|mail kodegeek@kodegeek.com; kill -9 %p"
#   Executing "echo 'Me quede sin memoria en auyan.local'|mail jose.nunez@gmail.com"...
#   Executing "kill -9 254"...
Killed
auyan:~ josevnz$ echo $?
137

Hay muchos recipes en Internet, pero este es uno de mis favoritos :)

java, kodegeek, oracle, programación , ,

  1. Sin comentarios aún.
  1. Miércoles, 15 de septiembre de 2010 a las 17:26 | #1
  2. Miércoles, 15 de septiembre de 2010 a las 17:30 | #2