Jmap can't connect to make a dump

后端 未结 14 1191
青春惊慌失措
青春惊慌失措 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:27

    In my case it is not as simple as check the user :(

    I have a script called collectd-java which invokes jstat and jmap. I've checked by top that such script is launched, as expected, by the user owning the JVM. However, jstat gives me what I need and jmap can't attach. Here is the script - the echo stuff is just the format I need to present the values:

    HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
    INTERVAL="${COLLECTD_INTERVAL:-60}"
    MAIN_CLASS="my.fully.qualified.MainClass"
    PID=$(pgrep -f ${MAIN_CLASS})
    
    get_jstat_classloaderdata() {
    VALUE=`jstat -class $PID 1 1 | awk '{print $1}' | grep -vi loaded`
    echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-java_classloader_loaded\" interval=$INTERVAL N:$VALUE"
    
    VALUE=`jstat -class $PID 1 1 | awk '{print $2}' | grep -vi bytes`
    echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-java_classloader_bytesload\" interval=$INTERVAL N:$VALUE"
    
    VALUE=`jstat -class $PID 1 1 | awk '{print $3}' | grep -vi unload`
    echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-java_classloader_unloaded\" interval=$INTERVAL N:$VALUE"
    
    VALUE=`jstat -class $PID 1 1 | awk '{print $4}' | grep -vi bytes`
    echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-java_classloader_bytesunload\" interval=$INTERVAL N:$VALUE"
    
    VALUE=`jstat -class $PID 1 1 | awk '{print $5}' | grep -vi time`
    echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-java_classloader_time\" interval=$INTERVAL N:$VALUE"
    }
    
    get_jmap_heapdata() {
            VALUE=$(jmap -heap ${PID} | grep MinHeapFreeRatio |awk '{print $3}')
            echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-jmap_minheapfreeratio\" interval=$INTERVAL N:$VALUE"
    
            VALUE=$(jmap -heap ${PID} | grep   MaxHeapFreeRatio|awk '{print $3}')
            echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-jmap_maxheapfreeratio\" interval=$INTERVAL N:$VALUE"
    
            VALUE=$(jmap -heap ${PID} | grep   MaxHeapSize|awk '{print $3}')
            echo "PUTVAL \"$HOSTNAME/exec-cecoco/gauge-jmap_maxheapsize\" interval=$INTERVAL N:$VALUE"
    }
    ##Do it
    get_jmap_heapdata
    get_jstat_classloaderdata
    

    Jstat succeeds and jmap fails. Does anyone understands it ?

提交回复
热议问题