解决JMap抓取heap使用统计信息报错的问题
如下所示:
****************************** /jmapjdksmallversiondiffrentfromjvmjdkvesionbegin/// [dev@iZ2ze8us9p89pfk02m9vs1Z~]$jmap-heap1541 AttachingtoprocessID1541,pleasewait... Errorattachingtoprocess:sun.jvm.hotspot.debugger.DebuggerException:cannotopenbinaryfile sun.jvm.hotspot.debugger.DebuggerException:sun.jvm.hotspot.debugger.DebuggerException:cannotopenbinaryfile atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163) atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278) atsun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671) atsun.jvm.hotspot.HotSpotAgent.setupDebuggerLinux(HotSpotAgent.java:611) atsun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:337) atsun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304) atsun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140) atsun.jvm.hotspot.tools.Tool.start(Tool.java:185) atsun.jvm.hotspot.tools.Tool.execute(Tool.java:118) atsun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49) atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:498) atsun.tools.jmap.JMap.runTool(JMap.java:201) atsun.tools.jmap.JMap.main(JMap.java:130) Causedby:sun.jvm.hotspot.debugger.DebuggerException:cannotopenbinaryfile atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(NativeMethod) atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$100(LinuxDebuggerLocal.java:62) atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1AttachTask.doit(LinuxDebuggerLocal.java:269) atsun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138) /jmapjdksmallversiondiffrentfromjvmjdkvesionend/// /jmapjdkbigversiondiffrentfromjvmjdkvesionbegin/// AttachingtoprocessID30413,pleasewait... Exceptioninthread"main"java.lang.reflect.InvocationTargetException atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:498) atsun.tools.jmap.JMap.runTool(JMap.java:201) atsun.tools.jmap.JMap.main(JMap.java:130) Causedby:java.lang.InternalError:void*typehasn'tbeenseenwhenparsingint* atsun.jvm.hotspot.HotSpotTypeDataBase.recursiveCreateBasicPointerType(HotSpotTypeDataBase.java:721) atsun.jvm.hotspot.HotSpotTypeDataBase.lookupType(HotSpotTypeDataBase.java:134) atsun.jvm.hotspot.HotSpotTypeDataBase.lookupOrCreateClass(HotSpotTypeDataBase.java:631) atsun.jvm.hotspot.HotSpotTypeDataBase.createType(HotSpotTypeDataBase.java:751) atsun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:195) atsun.jvm.hotspot.HotSpotTypeDataBase.(HotSpotTypeDataBase.java:89) atsun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395) atsun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305) atsun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140) atsun.jvm.hotspot.tools.Tool.start(Tool.java:185) atsun.jvm.hotspot.tools.Tool.execute(Tool.java:118) atsun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49) ...6more /jmapjdkbigversiondiffrentfromjvmjdkvesionend/// ****************************************
【问题】
执行jmap-heap命令是报错,方法返回参数类型不匹配
【分析】
考虑执行jmap的jdk版本同目标jvm的jdk版本不一致:
1>如果jmap的jdk版本比目标jvm高,执行会提示方法不兼容错误
2>如果jmap的jdk版本比目标jvm低,执行会提示jdk版本不一致错误
【解决】
采用执行jmap的jdk版本同目标jvm的jdk版本保持一致。
补充知识:jmap-heap返回结果分析
usingparallelthreadsinthenewgeneration. usingthread-localobjectallocation. ConcurrentMark-SweepGC HeapConfiguration: MinHeapFreeRatio=40 MaxHeapFreeRatio=70 MaxHeapSize=4294967296(4096.0MB) NewSize=858980352(819.1875MB) MaxNewSize=858980352(819.1875MB) OldSize=3435986944(3276.8125MB) NewRatio=4 SurvivorRatio=8 MetaspaceSize=21807104(20.796875MB) CompressedClassSpaceSize=1073741824(1024.0MB) MaxMetaspaceSize=17592186044415MB G1HeapRegionSize=0(0.0MB) HeapUsage:
新生代
NewGeneration(Eden+1SurvivorSpace): capacity=773128192(737.3125MB) used=95478696(91.05558013916016MB) free=677649496(646.2569198608398MB) 12.349659084738175%used EdenSpace: capacity=687276032(655.4375MB) used=95478696(91.05558013916016MB) free=591797336(564.3819198608398MB) 13.892336056322709%used FromSpace: capacity=85852160(81.875MB) used=0(0.0MB) free=85852160(81.875MB) 0.0%used ToSpace: capacity=85852160(81.875MB) used=0(0.0MB) free=85852160(81.875MB) 0.0%used concurrentmark-sweepgeneration: capacity=3435986944(3276.8125MB) used=119572370833685648(1.1403309901588979E11MB) free=17478152948676MB 3.480000732903997E9%used
根据以上数据,我们来check一些ratio:
NewRatio=2 EdenSpacecapacity=1063256064(1014.0MB) FromSpacecapacity=4718592(4.5MB) ToSpacecapacity=5242880(5.0MB)
简单加法,
Newsize=1014.0+4.5+5.0=1023.5MB
MaxHeapSize=3221225472(3072.0MB)
年轻代占比:
1023.5/3072.0=1/3。
换算NewRatio的计算,老年代/新生代,结果为2
以上这篇解决JMap抓取heap使用统计信息报错的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。