java heap-dump invocationtargetexception

Error de volcado de la pila de Java: los metadatos no parecen ser polimórficos



heap-dump invocationtargetexception (3)

Me encontré con el mismo problema al intentar ejecutar jmap en una instancia de AWS ElasticBeanstalk. El comando que lo reparó fue.

sudo debuginfo-install java-1.8.0-openjdk-devel

Por cierto, jmap se instaló en la instancia de AWS ElasticBeanstalk con comando

sudo yum install java-1.8.0-openjdk-devel-1.8.0.91-0.b14.10.amzn1.x86_64

Obtengo este Stacktrace cuando intento tomar un volcado de pila de un proceso Java en ejecución. ¿Qué causa esto y qué debo hacer para hacer un volcado de pila adecuado?

Dumping heap to dump.bin ... Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at sun.tools.jmap.JMap.runTool(JMap.java:201) at sun.tools.jmap.JMap.main(JMap.java:130) Caused by: java.lang.InternalError: Metadata does not appear to be polymorphic at sun.jvm.hotspot.types.basic.BasicTypeDataBase.findDynamicTypeForAddress(BasicTypeDataBase.java:278) at sun.jvm.hotspot.runtime.VirtualBaseConstructor.instantiateWrapperFor(VirtualBaseConstructor.java:102) at sun.jvm.hotspot.oops.Metadata.instantiateWrapperFor(Metadata.java:68) at sun.jvm.hotspot.memory.DictionaryEntry.klass(DictionaryEntry.java:71) at sun.jvm.hotspot.memory.Dictionary.classesDo(Dictionary.java:66) at sun.jvm.hotspot.memory.SystemDictionary.classesDo(SystemDictionary.java:190) at sun.jvm.hotspot.memory.SystemDictionary.allClassesDo(SystemDictionary.java:183) at sun.jvm.hotspot.utilities.HeapHprofBinWriter.writeClasses(HeapHprofBinWriter.java:942) at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:427) at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:62) at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260) at sun.jvm.hotspot.tools.Tool.start(Tool.java:223) at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:83) ... 6 more

Entorno: CentOS de 64 bits, Java OpenJDK Runtime Environment (compilación 1.8.0_31-b13) VM de servidor OpenJDK de 64 bits (compilación 25.31-b07, modo mixto)

Use ps para ver la versión java que se usa:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/jre/bin/java

Mi primer intento fue:

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/bin/jmap -dump:format=b,file=dump.bin 14984

Que me tiene

14984: Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding

Así que corrí con la opción -F

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/bin/jmap -F -dump:format=b,file=dump.bin 14984


Ok, lo encontré.

Estaba ejecutando el comando jmap como root , pero tuve que ejecutarlo como el usuario que inició el proceso java.

En mi caso:

sudo -u robau ./jmap -dump:format=b,file=/tmp/dump.bin 14984

Parece estar relacionado con este error de JDK: https://bugs.openjdk.java.net/browse/JDK-8075773


Tuve este problema en CentOS incluso cuando se ejecutaba como el usuario que inició el proceso. Lo que lo resolvió para mí fue instalar el paquete debuginfo correspondiente al paquete que proporciona la utilidad jmap.

Para instalar el paquete debuginfo, vea esta respuesta (sustituyendo su paquete java por glibc). Requiere obtener / usar la utilidad debuginfo-install, y asegurarse de que CentOS-Debuginfo.repo esté configurado correctamente y habilitado.