Skip to content

Commit 42f2e35

Browse files
committed
GH-610 lower number of JMX calls
1 parent 32ae938 commit 42f2e35

File tree

21 files changed

+103
-66
lines changed

21 files changed

+103
-66
lines changed

visualvm/applicationviews/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
<compile-dependency/>
103103
<run-dependency>
104104
<release-version>2</release-version>
105-
<specification-version>2.0</specification-version>
105+
<specification-version>2.4</specification-version>
106106
</run-dependency>
107107
</dependency>
108108
<dependency>

visualvm/applicationviews/src/org/graalvm/visualvm/application/views/monitor/ApplicationMonitorModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
5454
import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
5555
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
56-
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
5756
import org.openide.util.NbBundle;
5857

5958

@@ -465,7 +464,7 @@ private void initialize(Application application) {
465464
memoryMXBean = null;
466465
JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
467466
if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
468-
JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
467+
JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
469468
if (mxbeans != null) {
470469
memoryMXBean = mxbeans.getMemoryMXBean();
471470
}

visualvm/applicationviews/src/org/graalvm/visualvm/application/views/threads/ApplicationThreadsViewProvider.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.graalvm.visualvm.tools.jmx.JmxModel;
3737
import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
3838
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
39-
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
4039

4140
/**
4241
*
@@ -84,7 +83,7 @@ static ThreadMXBean resolveThreads(Application application) {
8483
JmxModel jmxModel = JmxModelFactory.getJmxModelFor(application);
8584
if (jmxModel != null && jmxModel.getConnectionState() == JmxModel.ConnectionState.CONNECTED) {
8685
if (jmxModel.isTakeThreadDumpSupported()) {
87-
JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
86+
JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
8887
return mxbeans == null ? null : mxbeans.getThreadMXBean();
8988
}
9089
}

visualvm/hostremote/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<compile-dependency/>
4040
<run-dependency>
4141
<release-version>2</release-version>
42-
<specification-version>2.0</specification-version>
42+
<specification-version>2.4</specification-version>
4343
</run-dependency>
4444
</dependency>
4545
<dependency>

visualvm/hostremote/src/org/graalvm/visualvm/host/remote/model/RemoteHostOverview.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.graalvm.visualvm.tools.jmx.JmxModel;
3434
import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
3535
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
36-
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
3736
import java.io.IOException;
3837
import java.lang.management.ManagementFactory;
3938
import java.lang.management.OperatingSystemMXBean;
@@ -216,7 +215,7 @@ private Application getJMXApplication() {
216215
JmxModel jmx = JmxModelFactory.getJmxModelFor(app);
217216

218217
if (jmx != null && jmx.getConnectionState().equals(JmxModel.ConnectionState.CONNECTED)) {
219-
JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmx);
218+
JvmMXBeans mxbeans = jmx.getJvmMXBeans();
220219
connection = jmx.getMBeanServerConnection();
221220

222221
if (mxbeans != null && connection != null) {

visualvm/jmx/nbproject/project.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<compile-dependency/>
4040
<run-dependency>
4141
<release-version>2</release-version>
42-
<specification-version>2.3</specification-version>
42+
<specification-version>2.4</specification-version>
4343
</run-dependency>
4444
</dependency>
4545
<dependency>

visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/DisconnectedJmxModel.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import javax.management.remote.JMXServiceURL;
3131
import org.graalvm.visualvm.application.jvm.HeapHistogram;
3232
import org.graalvm.visualvm.tools.jmx.JmxModel;
33+
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
3334

3435
/**
3536
*
@@ -53,6 +54,11 @@ public MBeanServerConnection getMBeanServerConnection() {
5354
return null;
5455
}
5556

57+
@Override
58+
public JvmMXBeans getJvmMXBeans() {
59+
return null;
60+
}
61+
5662
@Override
5763
public JMXServiceURL getJMXServiceURL() {
5864
return url;

visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxApplication.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
4848
import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
4949
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
50-
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
5150

5251
/**
5352
* This type of application represents an application
@@ -97,7 +96,7 @@ public EnvironmentProvider getEnvironmentProvider() {
9796
public int getPid() {
9897
if (pid == UNKNOWN_PID && getState() == Stateful.STATE_AVAILABLE) {
9998
if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
100-
JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
99+
JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
101100
if (mxbeans != null) {
102101
RuntimeMXBean rt = mxbeans.getRuntimeMXBean();
103102
if (rt != null) {
@@ -125,7 +124,7 @@ public boolean isLocalApplication() {
125124
// try to detect tunneled application
126125
if (getState() == Stateful.STATE_AVAILABLE) {
127126
if (jmxModel != null && jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
128-
JvmMXBeans mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
127+
JvmMXBeans mxbeans = jmxModel.getJvmMXBeans();
129128
if (mxbeans != null) {
130129
RuntimeMXBean rt = mxbeans.getRuntimeMXBean();
131130
if (rt != null) {

visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxModelImpl.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
import org.graalvm.visualvm.tools.jmx.CachedMBeanServerConnectionFactory;
5959
import org.graalvm.visualvm.tools.jmx.JmxModel;
6060
import org.graalvm.visualvm.tools.jmx.JmxModelFactory;
61+
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
62+
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
6163
import org.graalvm.visualvm.tools.jvmstat.JvmJvmstatModel;
6264
import org.graalvm.visualvm.tools.jvmstat.JvmJvmstatModelFactory;
6365
import org.graalvm.visualvm.tools.jvmstat.JvmstatModel;
@@ -104,6 +106,8 @@ class JmxModelImpl extends JmxModel {
104106
private ApplicationAvailabilityListener availabilityListener;
105107
private JmxSupport jmxSupport;
106108
private final Object jmxSupportLock = new Object();
109+
private JvmMXBeans mxbeans;
110+
private final Object mxbeansLock = new Object();
107111

108112
/**
109113
* Creates an instance of {@code JmxModel} for a {@link JvmstatApplication}.
@@ -259,6 +263,24 @@ public MBeanServerConnection getMBeanServerConnection() {
259263
return null;
260264
}
261265

266+
/**
267+
* <p>Method for obtaining the {@link JvmMXBeans} for
268+
* the given {@link JmxModel}.</p>
269+
*
270+
* @return a {@link JvmMXBeans} instance containing the MXBean
271+
* proxies for the Java platform MXBeans backed by the supplied
272+
* {@link JmxModel}. No MBean caching is applied on the supplied
273+
* {@link JmxModel}.
274+
*/
275+
public JvmMXBeans getJvmMXBeans() {
276+
synchronized (mxbeansLock) {
277+
if (mxbeans == null) {
278+
mxbeans = JvmMXBeansFactory.getJvmMXBeans(this);
279+
}
280+
return mxbeans;
281+
}
282+
}
283+
262284
/**
263285
* Returns the {@link JMXServiceURL} associated to this (@code JmxModel}.
264286
*

visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import org.graalvm.visualvm.tools.jmx.JmxModel;
5757
import org.graalvm.visualvm.tools.jmx.JmxModel.ConnectionState;
5858
import org.graalvm.visualvm.tools.jmx.JvmMXBeans;
59-
import org.graalvm.visualvm.tools.jmx.JvmMXBeansFactory;
6059
import org.openide.ErrorManager;
6160
import org.openide.util.Exceptions;
6261

@@ -76,7 +75,6 @@ public class JmxSupport {
7675
private static final String CMDLINE_PREFIX = "java_command: "; // NOI18N
7776
private static final String CMDLINE_EMPTY = "<unknown>"; // NOI18N
7877

79-
private JvmMXBeans mxbeans;
8078
private JmxModel jmxModel;
8179
// HotspotDiagnostic
8280
private boolean hotspotDiagnosticInitialized;
@@ -88,6 +86,9 @@ public class JmxSupport {
8886
private Boolean hasDumpAllThreads;
8987
private final Object hasDumpAllThreadsLock = new Object();
9088

89+
private Boolean hasDiagnosticCommand;
90+
private final Object hasDiagnosticCommandLock = new Object();
91+
9192
private String commandLine;
9293
private final Object commandLineLock = new Object();
9394

@@ -96,22 +97,13 @@ public class JmxSupport {
9697
}
9798

9899
private RuntimeMXBean getRuntime() {
99-
JvmMXBeans jmx = getJvmMXBeans();
100+
JvmMXBeans jmx = jmxModel.getJvmMXBeans();
100101
if (jmx != null) {
101102
return jmx.getRuntimeMXBean();
102103
}
103104
return null;
104105
}
105106

106-
private synchronized JvmMXBeans getJvmMXBeans() {
107-
if (mxbeans == null) {
108-
if (jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
109-
mxbeans = JvmMXBeansFactory.getJvmMXBeans(jmxModel);
110-
}
111-
}
112-
return mxbeans;
113-
}
114-
115107
Properties getSystemProperties() {
116108
try {
117109
RuntimeMXBean runtime = getRuntime();
@@ -145,7 +137,7 @@ boolean isReadOnlyConnection() {
145137
}
146138

147139
ThreadMXBean getThreadBean() {
148-
JvmMXBeans jmx = getJvmMXBeans();
140+
JvmMXBeans jmx = jmxModel.getJvmMXBeans();
149141
if (jmx != null) {
150142
return jmx.getThreadMXBean();
151143
}
@@ -157,7 +149,7 @@ HotSpotDiagnosticMXBean getHotSpotDiagnostic() {
157149
if (hotspotDiagnosticInitialized) {
158150
return hotspotDiagnosticMXBean;
159151
}
160-
JvmMXBeans jmx = getJvmMXBeans();
152+
JvmMXBeans jmx = jmxModel.getJvmMXBeans();
161153
if (jmx != null) {
162154
try {
163155
hotspotDiagnosticMXBean = jmx.getMXBean(
@@ -396,6 +388,27 @@ void setFlagValue(String name, String value) {
396388
}
397389
}
398390

391+
private boolean hasDiagnosticCommand() {
392+
synchronized (hasDiagnosticCommandLock) {
393+
if (hasDiagnosticCommand == null) {
394+
hasDiagnosticCommand = Boolean.FALSE;
395+
MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
396+
try {
397+
ObjectName diagCommName = new ObjectName(DIAGNOSTIC_COMMAND_MXBEAN_NAME);
398+
if (conn.isRegistered(diagCommName)) {
399+
hasDiagnosticCommand = Boolean.TRUE;
400+
}
401+
} catch (MalformedObjectNameException ex) {
402+
Exceptions.printStackTrace(ex);
403+
} catch (IOException ex) {
404+
LOGGER.log(Level.INFO, "hasDiagnosticCommand", ex); // NOI18N
405+
}
406+
}
407+
408+
return hasDiagnosticCommand.booleanValue();
409+
}
410+
}
411+
399412
private boolean hasDumpAllThreads() {
400413
synchronized (hasDumpAllThreadsLock) {
401414
if (hasDumpAllThreads == null) {
@@ -435,28 +448,26 @@ private String executeJCmd(String command) {
435448
}
436449

437450
String executeJCmd(String command, Map<String,Object> pars) {
438-
if (jmxModel.getConnectionState() == ConnectionState.CONNECTED) {
439-
MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
451+
if (jmxModel.getConnectionState() == ConnectionState.CONNECTED && hasDiagnosticCommand()) {
440452
try {
453+
MBeanServerConnection conn = jmxModel.getMBeanServerConnection();
441454
ObjectName diagCommName = new ObjectName(DIAGNOSTIC_COMMAND_MXBEAN_NAME);
442-
if (conn.isRegistered(diagCommName)) {
443-
Object[] params = null;
444-
String[] signature = null;
445-
Object ret;
455+
Object[] params = null;
456+
String[] signature = null;
457+
Object ret;
446458

447-
if (!pars.isEmpty()) {
448-
params = new Object[] {getJCmdParams(pars)};
449-
signature = new String[] {String[].class.getName()};
450-
}
451-
ret = conn.invoke(diagCommName, command, params, signature);
452-
if (ret instanceof String) {
453-
return (String)ret;
454-
}
459+
if (!pars.isEmpty()) {
460+
params = new Object[]{getJCmdParams(pars)};
461+
signature = new String[]{String[].class.getName()};
462+
}
463+
ret = conn.invoke(diagCommName, command, params, signature);
464+
if (ret instanceof String) {
465+
return (String) ret;
455466
}
456467
} catch (MalformedObjectNameException ex) {
457-
Exceptions.printStackTrace(ex);
468+
throw new IllegalArgumentException(ex);
458469
} catch (IOException ex) {
459-
LOGGER.log(Level.INFO,"executeJCmd", ex); // NOI18N
470+
LOGGER.log(Level.INFO, "executeJCmd", ex); // NOI18N
460471
} catch (InstanceNotFoundException ex) {
461472
Exceptions.printStackTrace(ex);
462473
} catch (MBeanException ex) {

0 commit comments

Comments
 (0)