1 /*
  2  * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.  Oracle designates this
  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package sun.management;
 27 
 28 import jdk.internal.perf.Perf;
 29 import sun.management.counter.*;
 30 import sun.management.counter.perf.*;
 31 import java.nio.ByteBuffer;
 32 import java.io.IOException;
 33 import java.net.InetAddress;
 34 import java.net.UnknownHostException;
 35 import java.util.List;
 36 import java.util.Arrays;
 37 import java.util.Collections;
 38 
 39 /**
 40  * Implementation of VMManagement interface that accesses the management
 41  * attributes and operations locally within the same Java virtual
 42  * machine.
 43  */
 44 class VMManagementImpl implements VMManagement {
 45 
 46     private static String version;
 47 
 48     private static boolean compTimeMonitoringSupport;
 49     private static boolean threadContentionMonitoringSupport;
 50     private static boolean currentThreadCpuTimeSupport;
 51     private static boolean otherThreadCpuTimeSupport;
 52     private static boolean objectMonitorUsageSupport;
 53     private static boolean synchronizerUsageSupport;
 54     private static boolean threadAllocatedMemorySupport;
 55     private static boolean gcNotificationSupport;
 56     private static boolean remoteDiagnosticCommandsSupport;
 57 
 58 
 59     static {
 60         version = getVersion0();
 61         if (version == null) {
 62             throw new AssertionError("Invalid Management Version");
 63         }
 64         initOptionalSupportFields();
 65     }
 66     private static native String getVersion0();
 67     private static native void initOptionalSupportFields();
 68 
 69     // Optional supports
 70     public boolean isCompilationTimeMonitoringSupported() {
 71         return compTimeMonitoringSupport;
 72     }
 73 
 74     public boolean isThreadContentionMonitoringSupported() {
 75         return threadContentionMonitoringSupport;
 76     }
 77 
 78     public boolean isCurrentThreadCpuTimeSupported() {
 79         return currentThreadCpuTimeSupport;
 80     }
 81 
 82     public boolean isOtherThreadCpuTimeSupported() {
 83         return otherThreadCpuTimeSupport;
 84     }
 85 
 86     public boolean isBootClassPathSupported() {
 87         return false;
 88     }
 89 
 90     public boolean isObjectMonitorUsageSupported() {
 91         return objectMonitorUsageSupport;
 92     }
 93 
 94     public boolean isSynchronizerUsageSupported() {
 95         return synchronizerUsageSupport;
 96     }
 97 
 98     public boolean isThreadAllocatedMemorySupported() {
 99         return threadAllocatedMemorySupport;
100     }
101 
102     public boolean isGcNotificationSupported() {
103         boolean isSupported = true;
104         try {
105             Class.forName("com.sun.management.GarbageCollectorMXBean");
106         } catch (ClassNotFoundException x) {
107             isSupported = false;
108         }
109         return isSupported;
110     }
111 
112     public boolean isRemoteDiagnosticCommandsSupported() {
113         return remoteDiagnosticCommandsSupport;
114     }
115 
116     public native boolean isThreadContentionMonitoringEnabled();
117     public native boolean isThreadCpuTimeEnabled();
118     public native boolean isThreadAllocatedMemoryEnabled();
119 
120     // AOT Subsystem
121     public native String  getAOTMode();
122     public native boolean isAOTRecording();
123     public native long    getAOTRecordingDuration();
124     public native boolean endAOTRecording();
125 
126     // Class Loading Subsystem
127     public int    getLoadedClassCount() {
128         long count = getTotalClassCount() - getUnloadedClassCount();
129         return (int) count;
130     }
131     public native long getTotalClassCount();
132     public native long getUnloadedClassCount();
133 
134     public native boolean getVerboseClass();
135 
136     // Memory Subsystem
137     public native boolean getVerboseGC();
138 
139     // Runtime Subsystem
140     public String   getManagementVersion() {
141         return version;
142     }
143 
144     public String getVmId() {
145         int pid = getProcessId();
146         String hostname = "localhost";
147         try {
148             hostname = InetAddress.getLocalHost().getHostName();
149         } catch (UnknownHostException e) {
150             // ignore
151         }
152 
153         return pid + "@" + hostname;
154     }
155     private native int getProcessId();
156 
157     public String   getVmName() {
158         return System.getProperty("java.vm.name");
159     }
160 
161     public String   getVmVendor() {
162         return System.getProperty("java.vm.vendor");
163     }
164     public String   getVmVersion() {
165         return System.getProperty("java.vm.version");
166     }
167     public String   getVmSpecName()  {
168         return System.getProperty("java.vm.specification.name");
169     }
170     public String   getVmSpecVendor() {
171         return System.getProperty("java.vm.specification.vendor");
172     }
173     public String   getVmSpecVersion() {
174         return System.getProperty("java.vm.specification.version");
175     }
176     public String   getClassPath() {
177         return System.getProperty("java.class.path");
178     }
179     public String   getLibraryPath()  {
180         return System.getProperty("java.library.path");
181     }
182 
183     public String   getBootClassPath( ) {
184         throw new UnsupportedOperationException(
185             "Boot class path mechanism is not supported");
186     }
187 
188     public long getUptime() {
189         return getUptime0();
190     }
191 
192     private List<String> vmArgs = null;
193     public synchronized List<String> getVmArguments() {
194         if (vmArgs == null) {
195             String[] args = getVmArguments0();
196             List<String> l = ((args != null && args.length != 0) ? Arrays.asList(args) :
197                                         Collections.<String>emptyList());
198             vmArgs = Collections.unmodifiableList(l);
199         }
200         return vmArgs;
201     }
202     public native String[] getVmArguments0();
203 
204     public native long getStartupTime();
205     private native long getUptime0();
206     public native int getAvailableProcessors();
207 
208     // Compilation Subsystem
209     public String getCompilerName() {
210         return System.getProperty("sun.management.compiler");
211     }
212     public native long getTotalCompileTime();
213 
214     // Thread Subsystem
215     public native long getTotalThreadCount();
216     public native int  getLiveThreadCount();
217     public native int  getPeakThreadCount();
218     public native int  getDaemonThreadCount();
219 
220     // Operating System
221     public String getOsName() {
222         return System.getProperty("os.name");
223     }
224     public String getOsArch() {
225         return System.getProperty("os.arch");
226     }
227     public String getOsVersion() {
228         return System.getProperty("os.version");
229     }
230 
231     // Hotspot-specific runtime support
232     public native long getSafepointCount();
233     public native long getTotalSafepointTime();
234     public native long getSafepointSyncTime();
235     public native long getTotalApplicationNonStoppedTime();
236 
237     public native long getLoadedClassSize();
238     public native long getUnloadedClassSize();
239     public native long getClassLoadingTime();
240     public native long getMethodDataSize();
241     public native long getInitializedClassCount();
242     public native long getClassInitializationTime();
243     public native long getClassVerificationTime();
244 
245     // Performance Counter Support
246     private PerfInstrumentation perfInstr = null;
247     private boolean noPerfData = false;
248 
249     private synchronized PerfInstrumentation getPerfInstrumentation() {
250         if (noPerfData || perfInstr != null) {
251              return perfInstr;
252         }
253 
254         // construct PerfInstrumentation object
255         Perf perf = Perf.getPerf();
256         try {
257             ByteBuffer bb = perf.attach(0);
258             if (bb.capacity() == 0) {
259                 noPerfData = true;
260                 return null;
261             }
262             perfInstr = new PerfInstrumentation(bb);
263         } catch (IllegalArgumentException e) {
264             // If the shared memory doesn't exist e.g. if -XX:-UsePerfData
265             // was set
266             noPerfData = true;
267         } catch (IOException e) {
268             throw new AssertionError(e);
269         }
270         return perfInstr;
271     }
272 
273     public List<Counter> getInternalCounters(String pattern) {
274         PerfInstrumentation perf = getPerfInstrumentation();
275         if (perf != null) {
276             return perf.findByPattern(pattern);
277         } else {
278             return Collections.emptyList();
279         }
280     }
281 }