Ошибка дампа кучи 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

Среда: 64-разрядная версия CentOS, среда выполнения Java OpenJDK (сборка 1.8.0_31-b13) 64-разрядная серверная виртуальная машина OpenJDK (сборка 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

person RobAu    schedule 16.11.2015    source источник
comment
Вы уверены, что используете одну и ту же версию Java, и обе они 64-битные? И запускать его с тем же пользователем?   -  person biziclop    schedule 16.11.2015
comment
Возможно, связано с bugs.launchpad.net/ubuntu/+source/ openjdk-6 / + bug / 1417962   -  person RobAu    schedule 16.11.2015


Ответы (4)


Хорошо, нашел.

Я выполнял команду jmap как root, но мне пришлось запустить ее как пользователь, запустивший процесс Java.

В моем случае:

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

Похоже, это связано с этой ошибкой JDK: https://bugs.openjdk.java.net/browse/JDK-8075773

person RobAu    schedule 16.11.2015
comment
есть хороший встроенный анализатор файлов кучи jhat /tmp/dump.bin, который проанализирует файл дампа кучи и предоставит результаты на порт 7000 - person Marcin Wasiluk; 23.11.2016
comment
Если вы пытались использовать флаг -F раньше, не забудьте удалить его при запуске с правильным пользователем, иначе у вас могут возникнуть проблемы. - person BrunoJCM; 25.06.2018
comment
Если вы по-прежнему получаете ту же ошибку, попробуйте установить пакет, упомянутый Big Pumpkin, и выполните эту команду. - person James; 07.02.2020

Я столкнулся с той же проблемой при попытке запустить jmap на экземпляре AWS ElasticBeanstalk. Команда, которая исправила это, была

sudo debuginfo-install java-1.8.0-openjdk-devel

Кстати, jmap был установлен на экземпляре AWS ElasticBeanstalk с помощью команды

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

person Big Pumpkin    schedule 12.12.2016
comment
У меня была эта проблема, даже когда я запускал команду как пользователь процесса. Этот ответ мне помог. - person James; 07.02.2020

У меня была эта проблема в CentOS, даже когда я работал как пользователь, запустивший процесс. Для меня это решило установку пакета debuginfo, соответствующего пакету, поставляющему утилиту jmap.

Чтобы установить пакет debuginfo, см. этот ответ (замена пакета java на glibc). Для этого требуется получить / использовать утилиту debuginfo-install и убедиться, что CentOS-Debuginfo.repo настроен правильно и включен.

person PeteyPabPro    schedule 30.04.2016
comment
Та же проблема и на CentOS 7. Я загрузил пакет с debuginfo.centos.org/7/x86_64 и установил его вручную, используя rpm -ivh java-1.8.0-openjdk-debuginfo*.rpm. Спасибо! - person xonya; 27.01.2017

В 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
person Zeki    schedule 01.06.2019
comment
Это работает потому что обновлен jdk? (и, таким образом, исправлена ​​ошибка JDK?) - person RobAu; 04.06.2019
comment
Интересный вопрос. Я попробую удалить пакет dbg и сообщу, что происходит. - person Zeki; 13.06.2019
comment
Ха, похоже, вы правы, он все еще работает после удаления пакета dbg! Я собираюсь обновить свой ответ. - person Zeki; 13.06.2019
comment
какие версии вы имеете в виду (до / после)? - person pstanton; 01.10.2019