2015-11-16 3 views
16

Я получаю эту Stacktrace, пытаясь взять кучу кучи из работающего Java-процесса. Что вызывает это и что мне нужно сделать, чтобы создать правильный кучи кучи?Ошибка кучи 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 (сборка 1.8.0_31-b13) OpenJDK 64-разрядного сервера VM (сборка 25.31-b07, смешанный режим)

Usign 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

Вы уверены, что вы используете ту же версию Java, и они оба 64 бит? И запустить его с одним и тем же пользователем? – biziclop

+0

Возможно, связанный с https://bugs.launchpad.net/ubuntu/+source/openjdk-6/+bug/1417962 – RobAu

ответ

15

Ok, я нашел его.

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

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

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

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

+1

есть хороший встроенный анализатор файлов кучи jhat /tmp/dump.bin, который будет анализировать кучу дампа файл и вывести результаты на порт 7000 –

6

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

Чтобы установить пакет debuginfo, см. this answer (заменяя ваш пакет java для glibc). Это требует получения/использования утилиты debuginfo-install и обеспечения правильной настройки и настройки CentOS-Debuginfo.repo.

+0

Та же проблема на CentOS 7 тоже. Я загрузил пакет с http://debuginfo.centos.org/7/x86_64/ и вручную установил его с помощью 'rpm -ivh java-1.8.0-openjdk-debuginfo * .rpm'. Спасибо! – xonya

8

Я столкнулся с тем же вопросом, пытаясь запустить 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