我有一个我想调试的java进程。它的问题是它有太多的开放连接,因此运行jmap失败,因为它无法连接到进程。 运行jmap -F会产生下一个错误:
Attaching to process ID 1772, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypeEntryTypeNameOffset" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:388)
at sun.jvm.hotspot.HotSpotTypeDataBase.getLongValueFromProcess(HotSpotTypeDataBase.java:369)
at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:102)
at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:568)
at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:332)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.tools.jmap.JMap.runTool(JMap.java:179)
at sun.tools.jmap.JMap.main(JMap.java:110)
Debugger attached successfully.
可能是什么问题?是否可以在不重新启动过程的情况下解决(重启后错误可能会消失,所以我想避免它。)
答案 0 :(得分:1)
可能是什么问题?是否可以在不重新启动过程的情况下解决(重启后错误可能会消失,所以我想避免它。)
冒着陈述明显的风险......
如果由于打开的连接太多而无法连接调试器,那么这可能也是您尝试查找的错误的根源。
尝试使用操作系统级实用程序找出当前进程打开的文件/套接字/等。你给了你一些线索,告诉你从哪里开始寻找。如果这还不够,请在代码库中搜索打开文件/套接字的所有位置,并检查它们以确保它们有一个封闭的try / finally
,始终关闭文件/套接字
答案 1 :(得分:0)
您可以使用Sun 6 JDK中的visualvm进行连接吗?它使用不同的方法,并允许您学习很多 - 这可能就足够了 - 但不是调试器。
答案 2 :(得分:0)
对于Sun Jvm: 你可以尝试新的
HotSpotDiagnostic().dumpHeap("d:\\HeapDump1",true);
如果HotSpotDiagnostic类在编译时不可见,那么 您可以将具有HotSpotDiagnosticMXBean.class的rt.jar复制到其他位置。使用&#34;添加外部jar&#34;在构建路径中引用复制的jar。这允许您创建对象并获取堆转储。