Jmap can't connect to make a dump

后端 未结 14 1182
青春惊慌失措
青春惊慌失措 2020-12-12 17:47

We have an open beta of an app which occasionally causes the heapspace to overflow. The JVM reacts by going on a permanent vacation.

To analyze this I would like to

相关标签:
14条回答
  • 2020-12-12 18:33

    What happens if you just run

    ./jmap -heap 11175 
    

    And are you sure the application JVM is identical to the JMAP JVM? (same version, etc)

    0 讨论(0)
  • 2020-12-12 18:34

    I got the same jmap error on a linux machine that have two different OpenJdks installed. First I installed OpenJDK 1.6 and after that OpenJDK 1.7.

    A call of ...

    /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -XshowSettings:properties -version
    
    # produce the following output ...
    ...
    java.library.path = /usr/java/packages/lib/amd64
        /usr/lib/x86_64-linux-gnu/jni
        /lib/x86_64-linux-gnu
        /usr/lib/x86_64-linux-gnu
        /usr/lib/jni
        /lib
        /usr/lib
    ...
    java version "1.7.0_65"
    

    With including '/usr/lib' every with OpenJDK 1.7.* started program includes the libraries of the first installed JDK (in my case OpenJDK 1.6.*). So the jmap versions of Java6 and Java7 failed.

    After I changed the start for the Java7 programms with included OpenJDK 1.7 libraries ...

    /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -Djava.library.path=/usr/lib/jvm/java- \
                      7-openjdk-amd64/jre/lib/amd64/server:/usr/java/packages/lib/amd64: \
                      /usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/ \
                      x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib ...
    

    I was able access proccess with the Java 7 version of the jmap program. But it needs a sudo to run.

    0 讨论(0)
  • 2020-12-12 18:40

    You need to use the jmap that comes with the JVM.

    0 讨论(0)
  • 2020-12-12 18:42

    Future Googlers:

    This could also happen if you installed the JDK while the process you're trying to jmap was running.

    If that's the case, restart the java process.

    0 讨论(0)
  • 2020-12-12 18:42

    I have the same problem, I'm trying to find a memory leak in a process running inside a Docker container. I wasn't able to use jmap, instead I used this:

    jcmd <pid> GC.class_histogram 
    

    This gives you a list of the objects in the memory. And from the Oracle documentation:

    It is recommended to use the latest utility, jcmd instead of jmap utility for enhanced diagnostics and reduced performance overhead. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks004.html

    0 讨论(0)
  • 2020-12-12 18:42

    When none of these work or if you don't want to change sensitive OS flags such as ptrace_scope:

    Either you can use jconsole/jvisualvm to trigger heap dumps or run any JMX client directly from console as follows as you are doing it locally on the machine that needs the dump and so is faster:

    echo 'jmx_invoke -m com.sun.management:type=HotSpotDiagnostic dumpHeap heapdump-20160309.hprof false' | java -jar jmxsh.jar -h $LOCALHOST_OR_IP -p $JMX_PORT
    

    I used the wget https://github.com/davr/jmxsh/raw/master/jmxsh.jar for this example.

    0 讨论(0)
提交回复
热议问题