Skip to content

Commit 3c2c325

Browse files
committed
Introduce JmxInitializationFeature.
1 parent 644a954 commit 3c2c325

File tree

4 files changed

+109
-92
lines changed

4 files changed

+109
-92
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/management/ManagementFeature.java

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,15 @@
4444

4545
import org.graalvm.nativeimage.ImageSingletons;
4646
import org.graalvm.nativeimage.hosted.Feature;
47-
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
4847
import org.graalvm.nativeimage.hosted.RuntimeReflection;
4948

49+
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
5050
import com.oracle.svm.core.feature.InternalFeature;
5151
import com.oracle.svm.core.jdk.JNIRegistrationUtil;
5252
import com.oracle.svm.core.jdk.RuntimeSupportFeature;
5353
import com.oracle.svm.core.thread.ThreadListenerSupport;
5454
import com.oracle.svm.core.thread.ThreadListenerSupportFeature;
55-
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
5655
import com.oracle.svm.util.ReflectionUtil;
57-
import com.oracle.svm.core.jfr.HasJfrSupport;
58-
import com.oracle.svm.core.VMInspectionOptions;
5956

6057
/** See {@link ManagementSupport} for documentation. */
6158
@AutomaticallyRegisteredFeature
@@ -86,26 +83,6 @@ public void duringSetup(DuringSetupAccess access) {
8683
}
8784
}
8885
access.registerObjectReplacer(this::replaceHostedPlatformManagedObject);
89-
90-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory");
91-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$Mappings");
92-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$IdentityMapping");
93-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DescriptorCache");
94-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.remote.util.ClassLogger");
95-
// Adding FlightRecorderMXBean in ManagementSupport class results in requiring the below
96-
// policies. The policies are normally specified as part of JmxCommonFeature,
97-
// but if JmxServer and JmxClient are not included in the image build,
98-
// then we have to provide the policies here.
99-
if (HasJfrSupport.get() && !VMInspectionOptions.hasJmxServerSupport() && !VMInspectionOptions.hasJmxClientSupport()) {
100-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.remote.util.EnvHelp");
101-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.Introspector");
102-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.MXBeanIntrospector");
103-
RuntimeClassInitialization.initializeAtBuildTime("java.beans.Introspector");
104-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.JavaBeansAccessor");
105-
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.StandardMBeanIntrospector");
106-
RuntimeClassInitialization.initializeAtBuildTime("jdk.management.jfr.MBeanUtils");
107-
}
108-
10986
}
11087

11188
/**

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/management/ManagementSupport.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@
8080
*
8181
* Support for {@link ManagementFactory#getPlatformMBeanServer()}: The {@link MBeanServer} that
8282
* makes all MXBean available too is allocated lazily at run time. This has advantages and
83-
* disadvantages. The {@link MBeanServer} and all the bean registrations is a quite heavyweight data
84-
* structure. All the attributes and operations of the beans are stored in several nested hash maps.
85-
* Putting all of that in the image heap would increase the image heap size, but also avoid the
86-
* allocation at run time on first access. Unfortunately, there are also many additional global
83+
* disadvantages. The {@link MBeanServer} and all the bean registrations is a quite heavy-weight
84+
* data structure. All the attributes and operations of the beans are stored in several nested hash
85+
* maps. Putting all of that in the image heap would increase the image heap size, but also avoid
86+
* the allocation at run time on first access. Unfortunately, there are also many additional global
8787
* caches for bean and attribute lookup, for example in {@link MXBeanLookup}, MXBeanIntrospector,
8888
* and {@link MBeanServerFactory}. Beans from the hosting VM that runs the image build must not be
8989
* made available at runtime using these caches, i.e., a complicated re-build of the caches would be
90-
* necessary at image build time. Therefore we opted to inialize the {@link MBeanServer} at run
90+
* necessary at image build time. Therefore we opted to initialize the {@link MBeanServer} at run
9191
* time.
9292
*
9393
* This has two important consequences: 1) There must not be any {@link MBeanServer} in the image

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -45,69 +45,6 @@ public boolean isInConfiguration(IsInConfigurationAccess access) {
4545
return VMInspectionOptions.hasJmxServerSupport() || VMInspectionOptions.hasJmxClientSupport();
4646
}
4747

48-
@Override
49-
public void afterRegistration(AfterRegistrationAccess access) {
50-
org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport rci = ImageSingletons.lookup(org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport.class);
51-
if (org.graalvm.compiler.serviceprovider.JavaVersionUtil.JAVA_SPEC <= 11) {
52-
// Activation has been removed in JDK 17.
53-
rci.initializeAtBuildTime("sun.rmi.server.Activation$ActivationSystemImpl_Stub", "JDK11 JMX support");
54-
}
55-
rci.initializeAtBuildTime("jdk.management.jfr.SettingDescriptorInfo", "JMX support");
56-
rci.initializeAtBuildTime("sun.rmi.runtime.Log$LogStreamLog", "JMX support");
57-
rci.initializeAtBuildTime("sun.rmi.runtime.Log", "JMX support");
58-
rci.initializeAtBuildTime("java.rmi.server.LogStream", "JMX support");
59-
rci.initializeAtBuildTime("sun.rmi.runtime.Log$LoggerLog", "JMX support");
60-
rci.initializeAtBuildTime("sun.rmi.server.Util", "JMX support");
61-
rci.initializeAtBuildTime("jdk.management.jfr.MBeanUtils", "JMX support");
62-
63-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.StandardMBeanIntrospector", "JMX support");
64-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MXBeanIntrospector", "JMX support");
65-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MXBeanLookup", "JMX support");
66-
rci.initializeAtBuildTime("com.sun.jmx.remote.util.EnvHelp", "JMX support");
67-
rci.initializeAtBuildTime("java.rmi.server.RemoteObjectInvocationHandler", "JMX support");
68-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.Introspector", "JMX support");
69-
rci.initializeAtBuildTime("java.beans.Introspector", "JMX support");
70-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.JavaBeansAccessor", "JMX support");
71-
72-
rci.initializeAtBuildTime("com.sun.jmx.remote.security.JMXPluggableAuthenticator", "JMX support");
73-
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MBeanInstantiator", "JMX support");
74-
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ArrayNotificationBuffer", "JMX support");
75-
rci.initializeAtBuildTime("com.sun.jmx.remote.security.HashedPasswordManager", "JMX support");
76-
rci.initializeAtBuildTime("com.sun.jmx.remote.security.JMXSubjectDomainCombiner", "JMX support");
77-
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ServerCommunicatorAdmin", "JMX support");
78-
rci.initializeAtBuildTime("com.sun.jmx.defaults.JmxProperties", "JMX support");
79-
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ServerNotifForwarder", "JMX support");
80-
81-
rci.initializeAtRunTime("sun.rmi.transport.ConnectionInputStream", "JMX support");
82-
rci.initializeAtRunTime("java.rmi.MarshalledObject$MarshalledObjectInputStream", "JMX support");
83-
rci.initializeAtRunTime("sun.rmi.server.UnicastRef2", "JMX support");
84-
rci.initializeAtRunTime("sun.rmi.server.UnicastRef", "JMX support");
85-
rci.initializeAtRunTime("sun.rmi.server.MarshalInputStream", "JMX support");
86-
rci.initializeAtRunTime("sun.rmi.runtime.NewThreadAction", "JMX support");
87-
rci.initializeAtRunTime("com.sun.jmx.remote.security.FileLoginModule", "JMX support");
88-
rci.initializeAtRunTime("com.sun.jmx.remote.security.JMXPluggableAuthenticator$FileLoginConfig", "JMX support");
89-
rci.initializeAtRunTime("sun.rmi.transport.DGCImpl", "JMX support");
90-
rci.initializeAtRunTime("sun.rmi.transport.DGCAckHandler", "JMX support");
91-
rci.initializeAtRunTime("sun.rmi.transport.GC", "JMX support");
92-
rci.initializeAtRunTime("sun.rmi.transport.DGCClient", "JMX support");
93-
rci.initializeAtRunTime("sun.rmi.transport.ObjectTable", "JMX support");
94-
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPEndpoint", "JMX support");
95-
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPChannel", "JMX support");
96-
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPTransport", "JMX support");
97-
rci.initializeAtRunTime("sun.rmi.transport.Transport", "JMX support");
98-
rci.initializeAtRunTime("java.rmi.server.ObjID", "JMX support");
99-
rci.initializeAtRunTime("sun.rmi.server.UnicastServerRef", "JMX support");
100-
rci.initializeAtRunTime("java.rmi.server.UID", "JMX support");
101-
rci.initializeAtRunTime("sun.rmi.runtime.RuntimeUtil", "JMX support");
102-
rci.initializeAtRunTime("java.rmi.dgc.VMID", "JMX support");
103-
rci.initializeAtRunTime("java.rmi.server.RMIClassLoader", "JMX support");
104-
rci.initializeAtRunTime("sun.rmi.server.LoaderHandler", "JMX support");
105-
rci.initializeAtRunTime("java.rmi.server.RemoteServer", "JMX support");
106-
rci.initializeAtRunTime("sun.rmi.registry.RegistryImpl", "JMX support");
107-
rci.initializeAtRunTime("java.rmi.server.UnicastRemoteObject", "JMX support");
108-
rci.initializeAtRunTime("sun.rmi.server.UnicastServerRef2", "JMX support");
109-
}
110-
11148
@Override
11249
public void beforeAnalysis(BeforeAnalysisAccess access) {
11350
configureJNI();
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2022, 2022, Red Hat Inc. All rights reserved.
4+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5+
*
6+
* This code is free software; you can redistribute it and/or modify it
7+
* under the terms of the GNU General Public License version 2 only, as
8+
* published by the Free Software Foundation. Oracle designates this
9+
* particular file as subject to the "Classpath" exception as provided
10+
* by Oracle in the LICENSE file that accompanied this code.
11+
*
12+
* This code is distributed in the hope that it will be useful, but WITHOUT
13+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15+
* version 2 for more details (a copy is included in the LICENSE file that
16+
* accompanied this code).
17+
*
18+
* You should have received a copy of the GNU General Public License version
19+
* 2 along with this work; if not, write to the Free Software Foundation,
20+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21+
*
22+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23+
* or visit www.oracle.com if you need additional information or have any
24+
* questions.
25+
*/
26+
27+
package com.oracle.svm.hosted.jdk;
28+
29+
import org.graalvm.nativeimage.ImageSingletons;
30+
31+
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
32+
import com.oracle.svm.core.feature.InternalFeature;
33+
34+
@AutomaticallyRegisteredFeature
35+
public class JmxInitializationFeature implements InternalFeature {
36+
@Override
37+
public void afterRegistration(AfterRegistrationAccess access) {
38+
org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport rci = ImageSingletons.lookup(org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport.class);
39+
if (org.graalvm.compiler.serviceprovider.JavaVersionUtil.JAVA_SPEC <= 11) {
40+
// Activation has been removed in JDK 17.
41+
rci.initializeAtBuildTime("sun.rmi.server.Activation$ActivationSystemImpl_Stub", "JDK11 JMX support");
42+
}
43+
rci.initializeAtBuildTime("jdk.management.jfr.SettingDescriptorInfo", "JMX support");
44+
rci.initializeAtBuildTime("sun.rmi.runtime.Log$LogStreamLog", "JMX support");
45+
rci.initializeAtBuildTime("sun.rmi.runtime.Log", "JMX support");
46+
rci.initializeAtBuildTime("java.rmi.server.LogStream", "JMX support");
47+
rci.initializeAtBuildTime("sun.rmi.runtime.Log$LoggerLog", "JMX support");
48+
rci.initializeAtBuildTime("sun.rmi.server.Util", "JMX support");
49+
rci.initializeAtBuildTime("jdk.management.jfr.MBeanUtils", "JMX support");
50+
51+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory", "JMX support");
52+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$Mappings", "JMX support");
53+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$IdentityMapping", "JMX support");
54+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.DescriptorCache", "JMX support");
55+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.StandardMBeanIntrospector", "JMX support");
56+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MXBeanIntrospector", "JMX support");
57+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MXBeanLookup", "JMX support");
58+
rci.initializeAtBuildTime("com.sun.jmx.remote.util.ClassLogger", "JMX support");
59+
rci.initializeAtBuildTime("com.sun.jmx.remote.util.EnvHelp", "JMX support");
60+
rci.initializeAtBuildTime("java.rmi.server.RemoteObjectInvocationHandler", "JMX support");
61+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.Introspector", "JMX support");
62+
rci.initializeAtBuildTime("java.beans.Introspector", "JMX support");
63+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.JavaBeansAccessor", "JMX support");
64+
65+
rci.initializeAtBuildTime("com.sun.jmx.remote.security.JMXPluggableAuthenticator", "JMX support");
66+
rci.initializeAtBuildTime("com.sun.jmx.mbeanserver.MBeanInstantiator", "JMX support");
67+
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ArrayNotificationBuffer", "JMX support");
68+
rci.initializeAtBuildTime("com.sun.jmx.remote.security.HashedPasswordManager", "JMX support");
69+
rci.initializeAtBuildTime("com.sun.jmx.remote.security.JMXSubjectDomainCombiner", "JMX support");
70+
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ServerCommunicatorAdmin", "JMX support");
71+
rci.initializeAtBuildTime("com.sun.jmx.defaults.JmxProperties", "JMX support");
72+
rci.initializeAtBuildTime("com.sun.jmx.remote.internal.ServerNotifForwarder", "JMX support");
73+
74+
rci.initializeAtRunTime("sun.rmi.transport.ConnectionInputStream", "JMX support");
75+
rci.initializeAtRunTime("java.rmi.MarshalledObject$MarshalledObjectInputStream", "JMX support");
76+
rci.initializeAtRunTime("sun.rmi.server.UnicastRef2", "JMX support");
77+
rci.initializeAtRunTime("sun.rmi.server.UnicastRef", "JMX support");
78+
rci.initializeAtRunTime("sun.rmi.server.MarshalInputStream", "JMX support");
79+
rci.initializeAtRunTime("sun.rmi.runtime.NewThreadAction", "JMX support");
80+
rci.initializeAtRunTime("com.sun.jmx.remote.security.FileLoginModule", "JMX support");
81+
rci.initializeAtRunTime("com.sun.jmx.remote.security.JMXPluggableAuthenticator$FileLoginConfig", "JMX support");
82+
rci.initializeAtRunTime("sun.rmi.transport.DGCImpl", "JMX support");
83+
rci.initializeAtRunTime("sun.rmi.transport.DGCAckHandler", "JMX support");
84+
rci.initializeAtRunTime("sun.rmi.transport.GC", "JMX support");
85+
rci.initializeAtRunTime("sun.rmi.transport.DGCClient", "JMX support");
86+
rci.initializeAtRunTime("sun.rmi.transport.ObjectTable", "JMX support");
87+
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPEndpoint", "JMX support");
88+
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPChannel", "JMX support");
89+
rci.initializeAtRunTime("sun.rmi.transport.tcp.TCPTransport", "JMX support");
90+
rci.initializeAtRunTime("sun.rmi.transport.Transport", "JMX support");
91+
rci.initializeAtRunTime("java.rmi.server.ObjID", "JMX support");
92+
rci.initializeAtRunTime("sun.rmi.server.UnicastServerRef", "JMX support");
93+
rci.initializeAtRunTime("java.rmi.server.UID", "JMX support");
94+
rci.initializeAtRunTime("sun.rmi.runtime.RuntimeUtil", "JMX support");
95+
rci.initializeAtRunTime("java.rmi.dgc.VMID", "JMX support");
96+
rci.initializeAtRunTime("java.rmi.server.RMIClassLoader", "JMX support");
97+
rci.initializeAtRunTime("sun.rmi.server.LoaderHandler", "JMX support");
98+
rci.initializeAtRunTime("java.rmi.server.RemoteServer", "JMX support");
99+
rci.initializeAtRunTime("sun.rmi.registry.RegistryImpl", "JMX support");
100+
rci.initializeAtRunTime("java.rmi.server.UnicastRemoteObject", "JMX support");
101+
rci.initializeAtRunTime("sun.rmi.server.UnicastServerRef2", "JMX support");
102+
}
103+
}

0 commit comments

Comments
 (0)