Opciones útiles de la máquina virtual de Java
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
Comentarios recientes