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
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
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
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é.
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