web-dev-qa-db-fra.com

Java Erreur de vidage de tas - Les métadonnées ne semblent pas polymorphes

J'obtiens ce Stacktrace lorsque j'essaye de prendre un vidage de tas à partir d'un processus Java Java en cours. Qu'est-ce qui cause cela et que dois-je faire pour faire un bon vidage de tas?

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

Environnement: CentOS 64 bits, Java OpenJDK Runtime Environment (build 1.8.0_31-b13) OpenJDK 64-Bit Server VM (build 25.31-b07, mode mixte) )

Utilisez ps pour voir la Java utilisée:

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

Mon premier essai a été:

/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

Cela m'a fait:

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

J'ai donc couru avec le -F option

/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
31
RobAu

Ok, je l'ai trouvé.

J'exécutais la commande jmap en tant que root, mais je devais exécuter en tant qu'utilisateur qui avait lancé le processus Java.

Dans mon cas:

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

Semble être lié à ce bogue JDK: https://bugs.openjdk.Java.net/browse/JDK-807577

31
RobAu

J'ai rencontré le même problème en essayant d'exécuter jmap sur une instance AWS ElasticBeanstalk. La commande qui l'a corrigé était

Sudo debuginfo-install Java-1.8.0-openjdk-devel

BTW, jmap a été installé sur l'instance AWS ElasticBeanstalk avec la commande

Sudo yum install Java-1.8.0-openjdk-devel-1.8.0.91-0.b14.10.amzn1.x86_64

11
Nan Zhong

J'ai eu ce problème sur CentOS même lors de l'exécution en tant qu'utilisateur qui a lancé le processus. Ce qui m'a résolu, c'est d'installer le paquet debuginfo correspondant au paquet fournissant l'utilitaire jmap.

Pour installer le paquet debuginfo, voir cette réponse (en substituant votre Java à la glibc). Cela nécessite d'obtenir/d'utiliser l'utilitaire debuginfo-install et de vous assurer que - CentOS-Debuginfo.repo est correctement configuré et activé.

7
PeteyPabPro

Sur Ubuntu, j'ai résolu ce problème en installant le paquet openjdk-dbg:

Sudo apt-get install openjdk-8-dbg

Je soupçonne maintenant que cela a résolu mon problème indirectement en mettant à niveau le jdk vers une version corrigeant le bogue. Vous pourrez peut-être résoudre ce problème avec:

 Sudo apt-get install openjdk-8

Remarque: Après la mise à niveau de Java, vous devez redémarrer le processus Java afin d'obtenir un vidage correct. Si vous ne t, vous obtiendrez quelque chose comme ceci:

Attaching to process ID 21957, please wait...
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:498)
    at Sun.tools.jmap.JMap.runTool(JMap.Java:201)
    at Sun.tools.jmap.JMap.main(JMap.Java:130)
Caused by: Sun.jvm.hotspot.debugger.UnmappedAddressException: 7f21453c9bf8
    at Sun.jvm.hotspot.debugger.PageCache.checkPage(PageCache.Java:208)
    at Sun.jvm.hotspot.debugger.PageCache.getData(PageCache.Java:63)
    at Sun.jvm.hotspot.debugger.DebuggerBase.readBytes(DebuggerBase.Java:225)
    at Sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readCInteger(LinuxDebuggerLocal.Java:498)
    at Sun.jvm.hotspot.debugger.linux.LinuxAddress.getCIntegerAt(LinuxAddress.Java:69)
    at Sun.jvm.hotspot.HotSpotTypeDataBase.getLongValueFromProcess(HotSpotTypeDataBase.Java:604)
    at Sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.Java:164)
    at Sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.Java:89)
    at Sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.Java:395)
    at Sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.Java:305)
    at Sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.Java:140)
    at Sun.jvm.hotspot.tools.Tool.start(Tool.Java:185)
    at Sun.jvm.hotspot.tools.Tool.execute(Tool.Java:118)
    at Sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.Java:83)
    ... 6 more
1
Zeki