61
61
public class JmxSupport implements DataRemovedListener {
62
62
private final static Logger LOGGER = Logger.getLogger(JmxSupport.class.getName());
63
63
private static final String PROCESS_CPU_TIME_ATTR = "ProcessCpuTime"; // NOI18N
64
+
65
+ /** IBM/OpenJ9 only. */
66
+ private static final String PROCESS_CPU_TIME_NS_ATTR = "ProcessCpuTimeByNS"; // NOI18N
67
+
68
+ /**
69
+ * IBM/OpenJ9 only.
70
+ * Returns the collective processing capacity available to the VM
71
+ * in units of 1% of a physical processor. In environments without
72
+ * some kind of virtual partitioning, this will simply be the number
73
+ * of CPUs * 100.
74
+ */
64
75
private static final String PROCESSING_CAPACITY_ATTR = "ProcessingCapacity"; // NOI18N
65
76
private static final String PERM_GEN = "Perm Gen"; // NOI18N
66
77
private static final String PS_PERM_GEN = "PS Perm Gen"; // NOI18N
@@ -76,11 +87,12 @@ public class JmxSupport implements DataRemovedListener {
76
87
private JVMImpl jvm;
77
88
private Object processCPUTimeAttributeLock = new Object();
78
89
private Boolean processCPUTimeAttribute;
79
- private long processCPUTimeMultiplier ;
90
+ private double processingCapacity ;
80
91
private Timer timer;
81
92
private MemoryPoolMXBean permGenPool;
82
93
private Collection<GarbageCollectorMXBean> gcList;
83
94
private String[] genName;
95
+ private String processCpuTimeAttr;
84
96
85
97
JmxSupport(Application app, JVMImpl vm) {
86
98
jvm = vm;
@@ -112,15 +124,20 @@ boolean hasProcessCPUTimeAttribute() {
112
124
MBeanInfo info = conn.getMBeanInfo(osName);
113
125
MBeanAttributeInfo[] attrs = info.getAttributes();
114
126
115
- processCPUTimeMultiplier = 1;
127
+ processingCapacity = 1;
116
128
for (MBeanAttributeInfo attr : attrs) {
117
129
String name = attr.getName();
118
- if (PROCESS_CPU_TIME_ATTR.equals(name)) {
130
+ if (PROCESS_CPU_TIME_ATTR.equals(name) && !processCPUTimeAttribute) {
131
+ processCPUTimeAttribute = Boolean.TRUE;
132
+ processCpuTimeAttr = name;
133
+ }
134
+ if (PROCESS_CPU_TIME_NS_ATTR.equals(name)) {
119
135
processCPUTimeAttribute = Boolean.TRUE;
136
+ processCpuTimeAttr = name;
120
137
}
121
138
if (PROCESSING_CAPACITY_ATTR.equals(name)) {
122
139
Number mul = (Number) conn.getAttribute(osName,PROCESSING_CAPACITY_ATTR);
123
- processCPUTimeMultiplier = mul.longValue();
140
+ processingCapacity = mul.longValue()/100.0/getAvailableProcessors ();
124
141
}
125
142
}
126
143
} catch (Exception ex) {
@@ -143,9 +160,9 @@ long getProcessCPUTime() {
143
160
144
161
if (conn != null) {
145
162
try {
146
- Long cputime = (Long)conn.getAttribute(osName,PROCESS_CPU_TIME_ATTR );
163
+ Long cputime = (Long)conn.getAttribute(osName,processCpuTimeAttr );
147
164
148
- return cputime.longValue()*processCPUTimeMultiplier ;
165
+ return (long)( cputime.longValue()/processingCapacity) ;
149
166
} catch (Exception ex) {
150
167
LOGGER.throwing(JmxSupport.class.getName(), "hasProcessCPUTimeAttribute", ex); // NOI18N
151
168
}
0 commit comments