Projet

Général

Profil

Révision f0548a37

IDf0548a37defad384b6a23844111edbeee8ea2b6d
Parent 7c397d94
Enfant 4e713c9b

Ajouté par Stefan Huehner il y a presque 7 ans

Fix jstat* plugins to work again with java 6+7, fix PU reporting for
Java8.

jstat column output is not stable across JVM versions (technically
version of jstat binary used).
New columns are added not add the end of column list but in the middle
breaking access via constant index.

Following table shows the known columns per version:
Oracle JDK / OpenJDK 1.5 .. 1.7
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
Openjdk 1.8 .. 10
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
Openjdk 11 .. 12
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT

Earlier commit here added support for java8+ but using version checking
if version == 1.5 > Use pre-java8 column format, else new format.

As fixing java6+7 would mean more version comparison which is ugly this
cmomit changes retrival logic to the following;
a.) Parse first line jstat output to find position for each label
b.) Then use that position to fetch value from 2nd line

That way code auto-adjusts to any ordering change without needing any
java version specific code or checks.

On the way fix 'Permanent Used' value reporting for java8 which was
broken (missing variable rename from PU -> MU when java8 support was
added).

Voir les différences:

plugins/jvm/jstat__heap
25 25
#       Target Java Virtual Machine to monitor are:
26 26
#         Sun JDK 5.0 (http://java.sun.com/javase/)
27 27
#         Sun JDK 8.0 (http://java.sun.com/javase/)
28
#         OpenJDK 1.7 .. 11 (https://openjdk.java.net/)
28 29
#         BEA JRockit 5.0 (http://dev2dev.bea.com/jrockit/)
29 30
#
30 31
# Parameters:
......
53 54
    if "${JAVA_HOME}/bin/java" -version 2>&1 | grep -qi 'jrockit'; then
54 55
        echo "bea"
55 56
    else
56
        version=$("${JAVA_HOME}/bin/java" -version 2>&1 | grep '^java version' | awk '{print $3}' | sed -e 's/\"//g' | cut -d'_' -f 1)
57
        if echo "$version" | grep -q '^1\.5\.'; then
58
            echo "sun15"
59
        else
60
            echo "sun"
61
        fi
57
        echo "sun"
62 58
  fi
63 59
}
64 60

  
......
114 110
            print "NurserySize.value " NurserySize * 1024;
115 111
            print "HeapSize.value " HeapSize * 1024;
116 112
            print "UsedHeapSize.value " UsedHeapSize * 1024; }'
117
    elif [ "${JDK_TYPE}" = "sun15" ]; then
118
        # shellcheck disable=SC2016
119
        awk_script='{
120
            S0C = $1;
121
            S1C = $2;
122
            S0U = $3;
123
            S1U = $4;
124
            EC  = $5;
125
            EU  = $6;
126
            OC  = $7;
127
            OU  = $8;
128
            PC  = $9;
129
            PU  = $10;
130
            S0F = S0C - S0U;
131
            S1F = S1C - S1U;
132
            EF  = EC  - EU;
133
            OF  = OC  - OU;
134
            PF  = PC  - PU;
135
            print "Eden_Used.value " EU * 1024;
136
            print "Eden_Free.value " EF * 1024;
137
            print "Survivor0_Used.value " S0U * 1024;
138
            print "Survivor0_Free.value " S0F * 1024;
139
            print "Survivor1_Used.value " S1U * 1024;
140
            print "Survivor1_Free.value " S1F * 1024;
141
            print "Old_Used.value " OU * 1024;
142
            print "Old_Free.value " OF * 1024;
143
            print "Permanent_Used.value " PU * 1024;
144
            print "Permanent_Free.value " PF * 1024; }'
145 113
    else
146
        # example output of jstat for Java 1.8:
147
        #   S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
148
        #   2048.0 2048.0 0.0 1344.0 694784.0 145013.5 1398272.0 414857.1 102400.0 96308.0 12544.0 11240.1 979 20.997 5 2.705 23.702
114
        # List & Order of columns of jstat changes with java versions
115
        # idx["YGC"] is index of YGC column in output (i.e. 13)
116
        # $idx["YGC"] then accesses the value at this position (taken from 2nd line of the output)
149 117
        # shellcheck disable=SC2016
150
        awk_script='{
151
            S0C = $1;
152
            S1C = $2;
153
            S0U = $3;
154
            S1U = $4;
155
            EC  = $5;
156
            EU  = $6;
157
            OC  = $7;
158
            OU  = $8;
159
            MC  = $9;
160
            MU  = $10;
161
            S0F = S0C - S0U;
162
            S1F = S1C - S1U;
163
            EF  = EC  - EU;
164
            OF  = OC  - OU;
165
            MF  = MC  - MU;
166
            print "Eden_Used.value " EU * 1024;
167
            print "Eden_Free.value " EF * 1024;
168
            print "Survivor0_Used.value " S0U * 1024;
169
            print "Survivor0_Free.value " S0F * 1024;
170
            print "Survivor1_Used.value " S1U * 1024;
171
            print "Survivor1_Free.value " S1F * 1024;
172
            print "Old_Used.value " OU * 1024;
173
            print "Old_Free.value " OF * 1024;
174
            print "Permanent_Used.value " PU * 1024;
175
            print "Permanent_Free.value " MF * 1024; }'
118
        awk_script='
119
	    NR==1 { 
120
                for (i=1;i<=NF;i++) idx[$i]=i
121
            }
122
            NR==2 {
123
                S0F = $idx["S0C"] - $idx["S0U"];
124
                S1F = $idx["S1C"] - $idx["S1U"];
125
                EF  = $idx["EC"]  - $idx["EU"];
126
                OF  = $idx["OC"]  - $idx["OU"];
127
                MF  = $idx["MC"]  - $idx["MU"];
128
                print "Eden_Used.value " $idx["EU"] * 1024;
129
                print "Eden_Free.value " EF * 1024;
130
                print "Survivor0_Used.value " $idx["S0U"] * 1024;
131
                print "Survivor0_Free.value " S0F * 1024;
132
                print "Survivor1_Used.value " $idx["S1U"] * 1024;
133
                print "Survivor1_Free.value " S1F * 1024;
134
                print "Old_Used.value " $idx["OU"] * 1024;
135
                print "Old_Free.value " OF * 1024;
136
                print "Permanent_Used.value " $idx["MU"] * 1024;
137
                print "Permanent_Free.value " MF * 1024;
138
            }'
176 139
    fi
177
    "${JAVA_HOME}/bin/jstat" -gc "$pid_num" | tail -1 | awk "$awk_script"
140
    "${JAVA_HOME}/bin/jstat" -gc "$pid_num" | awk "$awk_script"
178 141
}
179 142

  
180 143

  

Formats disponibles : Unified diff