Ошибка кучи Java-кучи - метаданные не выглядят полиморфными
Я получаю эту Stacktrace, пытаясь взять кучу кучи из работающего Java-процесса. Что вызывает это и что мне нужно сделать, чтобы создать правильный кучи кучи?
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
Окружающая среда: CentOS 64 бит, Java OpenJDK Runtime Environment (build 1.8.0_31-b13) OpenJDK 64-разрядная серверная VM (сборка 25.31-b07, смешанный режим)
Упорядочить ps
, чтобы увидеть используемую версию java:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.31-1.b13.el6_6.x86_64/jre/bin/java
Моя первая попытка:
/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
Это меня:
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
Итак, я побежал с опцией -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
Ответы
Ответ 1
Хорошо, я нашел его.
Я выполнял команду jmap
как root
, но мне приходилось запускать как пользователь, который запустил java-процесс.
В моем случае:
sudo -u robau ./jmap -dump:format=b,file=/tmp/dump.bin 14984
Кажется, это связано с этой ошибкой JDK:
https://bugs.openjdk.java.net/browse/JDK-8075773
Ответ 2
Я столкнулся с той же проблемой, пытаясь запустить jmap на экземпляре AWS ElasticBeanstalk. Команда, которая его исправила, была
sudo debuginfo-install java-1.8.0-openjdk-devel
BTW, jmap был установлен на экземпляре AWS ElasticBeanstalk с командой
sudo yum install java-1.8.0-openjdk-devel-1.8.0.91-0.b14.10.amzn1.x86_64
Ответ 3
У меня была эта проблема в CentOS, даже когда я запускался как пользователь, который начал процесс. Для меня это решил установить пакет debuginfo, соответствующий пакету, поставляющему утилиту jmap.
Чтобы установить пакет debuginfo, см. этот ответ (подставляя ваш пакет java для glibc). Для этого требуется получение/использование утилиты debuginfo-install, и убедитесь, что CentOS-Debuginfo.repo настроен правильно и включен.
Ответ 4
В Ubuntu я решил эту проблему, установив пакет openjdk-dbg:
sudo apt-get install openjdk-8-dbg
Теперь я подозреваю, что это решило мою проблему косвенно путем обновления jdk до версии, которая исправила ошибку. Вы можете решить эту проблему с помощью:
sudo apt-get install openjdk-8
Примечание. После обновления java необходимо перезапустить процесс java, чтобы получить правильный дамп. Если вы этого не сделаете, вы получите что-то вроде этого:
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