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.