Ubicación del método erróneo

Cuando haya determinado el nivel de optimización más bajo en el que el compilador JIT o AOT debe compilar métodos para desencadenar la anomalía, puede averiguar qué parte del programa Java™ , cuando se compila, provoca la anomalía. A continuación, puede indicar al compilador que limite el método alternativo a un método, una clase o un paquete específicos, permitiendo al compilador compilar el resto del programa como lo hace normalmente. En caso de anomalías del compilador JIT, si se produce la anomalía con -Xjit:optLevel=noOpt, también puede indicar al compilador que no compile el método o los métodos que causan la anomalía.

Antes de empezar

Si ve una salida de error como la del ejemplo, puede utilizarla para identificar el método erróneo:
Unhandled exception
Type=Segmentation error vmState=0x00000000
Target=2_30_20050520_01866_BHdSMr (Linux 2.4.21-27.0.2.EL)
CPU=s390x (2 logical CPUs) (0x7b6a8000 RAM)
J9Generic_Signal_Number=00000004 Signal_Number=0000000b Error_Value=4148bf20 Signal_Code=00000001
Handler1=00000100002ADB14 Handler2=00000100002F480C InaccessibleAddress=0000000000000000
gpr0=0000000000000006 gpr1=0000000000000006 gpr2=0000000000000000 gpr3=0000000000000006
gpr4=0000000000000001 gpr5=0000000080056808 gpr6=0000010002BCCA20 gpr7=0000000000000000
......
Compiled_method=java/security/AccessController.toArrayOfProtectionDomains([Ljava/lang/Object;
Ljava/security/AccessControlContext;)[Ljava/security/ProtectionDomain;
Las líneas importantes son:
vmState=0x00000000
Indica que el código que ha fallado no era código de tiempo de ejecución de la JVM.
Module=orModule_base_address=
No en la salida (podría estar vacía o ser cero) porque el código fue compilado por el JIT, y fuera de cualquier DLL o biblioteca.
Compiled_method=
Indica el método Java para el que se ha generado el código compilado.

Acerca de esta tarea

Si la salida no indica el método erróneo, siga estos pasos para identificar el método erróneo:

Procedimiento

  1. Ejecute el programa Java con los parámetros JIT verbose y vlog=< nombre_archivo> añadidos a la opción -Xjit o -Xaot .
    Con estos parámetros, el compilador lista los métodos compilados en un archivo de registro llamado <filename>.<date>.<time>.<pid>, también llamado archivo de límite. Un archivo de límite normal contiene líneas que corresponden a los métodos compilados, como:
    + (hot) java/lang/Math.max(II)I @ 0x10C11DA4-0x10C11DDD
    Las líneas que no empiezan por el signo más son ignoradas por el compilador en los siguientes pasos y puede eliminarlas del archivo. Los métodos compilados por el compilador AOT empiezan por+ (AOT cold). Los métodos para los que se carga el código AOT desde la memoria caché de clase compartida empiezan por+ (AOT load).
  2. Ejecute de nuevo el programa con el parámetro JIT o AOT limitFile=(< filename>, < m>, < n>), donde < filename> es la vía de acceso al archivo de límite, y < m> y < n> son números de línea que indican el primer y último método del archivo de límite que se debe compilar.
    El compilador compila sólo los métodos listados en las líneas <m> a <n> del archivo de límite. Los métodos no mostrados en el archivo de límite y los métodos mostrados en líneas fuera del rango no se compilan y no se cargará ningún código AOT en la memoria caché de datos compartidos para dichos métodos.
    Si el programa ya no falla, uno o varios de los métodos que ha eliminado en la última iteración habrán sido la causa de la anomalía.
  3. Opcional: Si está diagnosticando un problema de AOT, ejecute el programa por segunda vez con las mismas opciones para permitir que los métodos compilados se carguen desde la memoria caché de datos compartidos. También puede añadir la opción –Xaot:scount=0 para asegurarse de que los métodos compilados por AOT almacenados en la memoria caché de datos compartidos se utilizarán cuando se llame por primera vez al método.
    Algunas anomalías de compilación AOT se producen sólo cuando el código compilado por AOT se carga desde la memoria caché de datos compartidos. Para ayudar a diagnosticar estos problemas, utilice la opción –Xaot:scount=0 para asegurarse de que los métodos compilados por AOT almacenados en la memoria caché de datos compartidos se utilizan cuando se llama por primera vez al método, lo que puede hacer que el problema sea más fácil de reproducir. Tenga en cuenta que si establece la opción scount en 0, forzará la carga de código AOT y detendrá cualquier hebra de aplicación que esté esperando ejecutar dicho método. Por tanto, sólo debería utilizarse para fines de diagnóstico. Se pueden producir tiempos de pausa más significativos con la opción –Xaot:scount=0.
  4. Repita este proceso utilizando distintos valores para < m> y < n>, tantas veces como sea necesario, para encontrar el conjunto mínimo de métodos que se deben compilar para desencadenar la anomalía.
    Dividiendo por dos el número de líneas seleccionadas cada vez, puede realizar una búsqueda binaria del método erróneo.
    A menudo, puede reducir el archivo a una sola línea.

Qué hacer a continuación

Cuando haya ubicado el método erróneo, podrá inhabilitar el compilador JIT o AOT solo para el método erróneo. Por ejemplo, si el método java/lang/Math.max(II)I hace que falle el programa cuando se realiza la compilación JIT con optLevel=hot, podrá ejecutar el programa con:
-Xjit:{java/lang/Math.max(II)I}(optLevel=warm,count=0)
para compilar solo el método anómalo en un nivel de optimización de warm, pero compilar todos los demás métodos como de costumbre.
Si un método falla cuando se compila mediante JIT en noOpt, puede excluirlo de la compilación mediante el parámetro exclude={<method>}:
-Xjit:exclude={java/lang/Math.max(II)I}
Si un método hace que el programa falle cuando el código AOT se compila o se carga desde la memoria caché de datos compartidos, excluya el método de la compilación de AOT y la carga de AOT mediante el parámetro exclude={<method>}:
-Xaot:exclude={java/lang/Math.max(II)I}
Los métodos AOT se compilan sólo en el nivel de optimización de cold. Evitar la compilación AOT o la carga AOT es el mejor enfoque para estos métodos.

Inicio de los cambios para la renovación de servicio 1 fixpack 10Los métodos AOT también se pueden invalidar en la memoria caché compartida para evitar la carga utilizando la subopción -Xshareclasses:invalidateAotMethods . Para obtener más información, consulte -Xshareclasses.Fin de los cambios para la renovación de servicio 1 fixpack 10