java - 无法在 java 进程上转储堆

标签 java heap-dump jmap

我有一个我想要调试的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.

可能是什么问题?是否可以在不重启进程的情况下解决(重启后bug可能会消失,所以我想避免它)。

最佳答案

What can be the problem? Can it be solved without restarting the process (It is possible the bug will disappear after restarting so I want to avoid it).

冒着陈述显而易见的风险......

如果由于打开的连接过多而无法与调试器连接,这也可能是您尝试查找的错误的根源。

尝试使用操作系统级实用程序来找出进程当前打开的文件/套接字/等。你给你一些线索告诉你从哪里开始寻找。如果这还不够,请在代码库中搜索打开文件/套接字的所有位置,并检查它们以确保它们具有始终的封闭try/finally关闭文件/套接字。

关于java - 无法在 java 进程上转储堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486693/

相关文章:

java - 带有 jmap 的堆转储抛出 NullPointerException

java - jmap 崩溃并显示 "can not get class data for"

java - Tomcat session 的 Java 类是什么?

java - 访问 Oracle SYS_REFCURSOR

java - 自定义 facelet 函数是否脏?

java - VM 崩溃后如何禁用创建 Java 堆转储?

java - 由于 "unable to create new native thread"导致 OutOfMemory 时的堆转储

java - 向其他人授予对生成的 HeapDumpOnOutOfMemoryError 文件 .hprof 的读取权限

java - 如何将字符串拆分为括号定义的部分

java - 继承属性访问