実行中のJavaプロセスからヒープダンプを取得しようとすると、このStacktraceを取得します。これを引き起こす原因と、適切なヒープダンプを作成するために何をする必要がありますか?
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-Bit Server VM(build 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
わかった。
jmap
コマンドをroot
として実行していましたが、Javaプロセスを開始したユーザーとして実行する必要がありました。
私の場合:
Sudo -u robau ./jmap -dump:format=b,file=/tmp/dump.bin 14984
このJDKバグに関連しているようです: https://bugs.openjdk.Java.net/browse/JDK-807577
AWS ElasticBeanstalkインスタンスでjmapを実行しようとすると、同じ問題が発生しました。それを修正したコマンドは
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
プロセスを開始したユーザーとして実行している場合でも、CentOSでこの問題が発生しました。私にとってそれを解決したのは、jmapユーティリティを提供するパッケージに対応するdebuginfoパッケージをインストールすることでした。
Debuginfoパッケージをインストールするには、 この回答 (glibcの代わりにJavaパッケージを使用))を参照してください。debuginfo-installユーティリティを取得/使用し、- CentOS-Debuginfo.repo が正しくセットアップされ、有効になっています。
Ubuntuでは、openjdk-dbgパッケージをインストールすることでこの問題を解決しました。
Sudo apt-get install openjdk-8-dbg
バグを修正したバージョンにjdkをアップグレードすることで、これで問題が間接的に解決されたと思われます。次の方法でこの問題を解決できる場合があります。
Sudo apt-get install openjdk-8
注: Javaをアップグレードした後、適切なダンプを取得するには、Javaプロセスを再起動する必要があります。 t、次のようなものが得られます。
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