Tengo varios procesos Java y estoy tratando de manejar el montón volcados creado cuando OOM error se producen. Cuando digo administrar quiero decir

  • nombre de el montón de volcado de manera diferente, basado en el proceso de origen
  • borrar viejas montón volcados para conservar espacio en disco

Cuando dumping montón de OOM con

 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp

la JVM crea un archivo con el siguiente nombre java_pidXXXX.hprof especificados en la carpeta /tmp (donde XXXX es el PID del proceso).
Es de todos modos hay que especificar un formato diferente donde el PID y la FECHA se utiliza para crear el nombre de archivo?
Después de googlear durante una hora he intentado myPrefix_$, {pid}, ‘fecha’, etc..
Las únicas dos cosas que funcionan son

  1. no especificar el nombre de archivo y obtener java_pidXXXX.hprof
  2. especificar un archivo estático nombre por ejemplo, \tmp\OOM.hprof.

si la carpeta \tmp no existe, no se crean, ni el montón de volcado se crea.

La idea de que podría utilizar es agregar un comando en OOM error

-XX:OnOutOfMemoryError="doSomething.sh %p"

pero yo estaba tratando de evitar que necesitan para implementar la «doSomething.sh»

¿Por qué necesita la fecha en el nombre? Si desea eliminar los archivos antiguos, que puede hacer que el tiempo de modificación de los archivos, no necesita de la fecha en el nombre.

OriginalEl autor Dan M | 2015-12-03

2 Comentarios

  1. 7

    La -XX:HeapDumpPath en la línea de comandos no dar más flexibilidad de lo que ya han descubierto. Es decir, usted puede:

    • Establecer un nombre de directorio y, a continuación, el nombre predeterminado java_pidXXX.hprof será creado en el directorio.
    • Conjunto de un nombre de archivo y ese archivo se utiliza como-es.

    El código correspondiente en el punto de origen es heapDumper.cpp. La lectura es, no se parece a ninguna «magia secuencias» dentro de la ruta dada:

    • Comprueba si la ruta especificada es un directorio. Si es así, que utiliza como prefijo, agrega un archivo separador, y utiliza el nombre de archivo predeterminado que se construye de rígida piezas utilizando una cadena de formato que no está bajo su control.
    • Si no es un directorio, sólo se utiliza como es.
    • Si no es la primera volcado en este JVM de la vida, también adjunta un número de secuencia.

    Que es. Ningún análisis de la ruta de acceso más allá de determinar si es un directorio o no.

    La única flexibilidad que usted puede añadir a esto es el uso de la cáscara de las habilidades cuando se construye el nombre en la línea de comandos. Por eso usted puede ver algunos ejemplos en la web que usar algo como name_`date`.ext – esta es procesada por el shell, que sustituye `date` con la fecha actual una vez. Es decir, el nombre de archivo será siempre la fecha/hora cuando el shell procesa el comando y comenzó la JVM – no de la fecha/hora cuando el vertedero fue creado. Si eso es lo suficientemente bueno para usted – usted puede usarlo. Tenga en cuenta que hoy en día se considera más aceptable el uso de la sintaxis name_$(date).ext.

    Si sólo necesita de la fecha con el fin de ser capaz de eliminar los archivos antiguos, a continuación, usted puede quitar basado en el archivo de la última modificación (el Unix/Linux utilidad find puede ayudar con eso). No es necesario tener la fecha en el nombre.

    La $(date) (o `date`) truco no le ayuda con el PID. La cáscara también se puede sustituir el actual PID si utiliza $$ – pero es el PID de la shell que los procesos de la línea de comandos, no la JVM proceso en sí. Sin embargo, si usted comienza su aplicación en JAVA utilizando el shell exec comando, recibe el mismo ID de proceso como la cáscara que lo originó, entonces usted puede utilizar $$ para crear su nombre de archivo. Sin embargo, recuerde que nada después de exec va a ser ejecutado a partir de la secuencia de comandos.

    Así que usted puede intentar el cambio dinámico del nombre de archivo que @apangin sugirió en su respuesta. Nota, sin embargo, que probablemente será un poco difícil identificar el momento de la volcado en sí mismo, como que usted querrá tener el nombre de archivo antes de la OOM que en realidad sucede.

    OriginalEl autor RealSkeptic

  2. 7

    HeapDumpPath es un manejable opción VM. Esto significa que usted puede configurarlo para lo que quieras en tiempo de ejecución mediante JMX.

        String pid = ManagementFactory.getRuntimeMXBean().getName();
        pid = pid.substring(0, pid.indexOf('@'));
        String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String fileName = "/tmp/heap_" + pid + "_" + date + ".dump";
    
        HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
                ManagementFactory.getPlatformMBeanServer(),
                "com.sun.management:type=HotSpotDiagnostic",
                HotSpotDiagnosticMXBean.class);
        bean.setVMOption("HeapDumpOnOutOfMemoryError", "true");
        bean.setVMOption("HeapDumpPath", fileName);

    OriginalEl autor apangin

Dejar respuesta

Please enter your comment!
Please enter your name here