1 /*
2 * Copyright (c) 2003, 2025, 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 #include <jni.h>
27 #include <stdlib.h>
28 #include "jvm.h"
29 #include "management.h"
30 #include "sun_management_VMManagementImpl.h"
31
32 #define MAX_VERSION_LEN 20
33
34 JNIEXPORT jstring JNICALL
35 Java_sun_management_VMManagementImpl_getVersion0
36 (JNIEnv *env, jclass dummy)
37 {
38 char buf[MAX_VERSION_LEN];
39 jstring version_string = NULL;
40 unsigned int major = ((unsigned int) jmm_version & 0x0FFF0000) >> 16;
41 unsigned int minor = ((unsigned int) jmm_version & 0xFF00) >> 8;
42
43 snprintf(buf, sizeof(buf), "%d.%d", major, minor);
44 version_string = (*env)->NewStringUTF(env, buf);
45 return version_string;
46 }
47
48 static void setStaticBooleanField
49 (JNIEnv* env, jclass cls, const char* name, jboolean value)
50 {
51 jfieldID fid;
52 fid = (*env)->GetStaticFieldID(env, cls, name, "Z");
53 if (fid != 0) {
54 (*env)->SetStaticBooleanField(env, cls, fid, value);
55 }
56 }
57
58 JNIEXPORT void JNICALL
59 Java_sun_management_VMManagementImpl_initOptionalSupportFields
60 (JNIEnv *env, jclass cls)
61 {
62 jmmOptionalSupport mos;
63 jmm_interface->GetOptionalSupport(env, &mos);
64
65 jboolean value;
66
67 value = mos.isCompilationTimeMonitoringSupported;
68 setStaticBooleanField(env, cls, "compTimeMonitoringSupport", value);
69
70 value = mos.isThreadContentionMonitoringSupported;
71 setStaticBooleanField(env, cls, "threadContentionMonitoringSupport", value);
72
73 value = mos.isCurrentThreadCpuTimeSupported;
74 setStaticBooleanField(env, cls, "currentThreadCpuTimeSupport", value);
75
76 value = mos.isOtherThreadCpuTimeSupported;
77 setStaticBooleanField(env, cls, "otherThreadCpuTimeSupport", value);
78
79 if (jmm_version >= JMM_VERSION_1_1) {
80 value = mos.isObjectMonitorUsageSupported;
81 setStaticBooleanField(env, cls, "objectMonitorUsageSupport", value);
82
83 value = mos.isSynchronizerUsageSupported;
84 setStaticBooleanField(env, cls, "synchronizerUsageSupport", value);
85 } else {
86 setStaticBooleanField(env, cls, "objectMonitorUsageSupport", JNI_FALSE);
87 setStaticBooleanField(env, cls, "synchronizerUsageSupport", JNI_FALSE);
88 }
89
90 value = mos.isThreadAllocatedMemorySupported;
91 setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value);
92
93 value = mos.isRemoteDiagnosticCommandsSupported;
94 setStaticBooleanField(env, cls, "remoteDiagnosticCommandsSupport", value);
95 }
96
97 JNIEXPORT jobjectArray JNICALL
98 Java_sun_management_VMManagementImpl_getVmArguments0
99 (JNIEnv *env, jobject dummy)
100 {
101 return JVM_GetVmArguments(env);
102 }
103
104 JNIEXPORT jlong JNICALL
105 Java_sun_management_VMManagementImpl_getTotalClassCount
106 (JNIEnv *env, jobject dummy)
107 {
108 /* JMM_CLASS_LOADED_COUNT is the total number of classes loaded */
109 jlong count = jmm_interface->GetLongAttribute(env, NULL,
110 JMM_CLASS_LOADED_COUNT);
111 return count;
112 }
113
114 JNIEXPORT jlong JNICALL
115 Java_sun_management_VMManagementImpl_getUnloadedClassCount
116 (JNIEnv *env, jobject dummy)
117 {
118 /* JMM_CLASS_UNLOADED_COUNT is the total number of classes unloaded */
119 jlong count = jmm_interface->GetLongAttribute(env, NULL,
120 JMM_CLASS_UNLOADED_COUNT);
121 return count;
122 }
123
124 JNIEXPORT jboolean JNICALL
125 Java_sun_management_VMManagementImpl_getVerboseGC
126 (JNIEnv *env, jobject dummy)
127 {
128 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_GC);
129 }
130
131 JNIEXPORT jboolean JNICALL
132 Java_sun_management_VMManagementImpl_getVerboseClass
133 (JNIEnv *env, jobject dummy)
134 {
135 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_CLASS);
136 }
137
138 JNIEXPORT jlong JNICALL
139 Java_sun_management_VMManagementImpl_getTotalThreadCount
140 (JNIEnv *env, jobject dummy)
141 {
142 return jmm_interface->GetLongAttribute(env, NULL,
143 JMM_THREAD_TOTAL_COUNT);
144 }
145
146 JNIEXPORT jint JNICALL
147 Java_sun_management_VMManagementImpl_getLiveThreadCount
148 (JNIEnv *env, jobject dummy)
149 {
150 jlong count = jmm_interface->GetLongAttribute(env, NULL,
151 JMM_THREAD_LIVE_COUNT);
152 return (jint) count;
153 }
154
155 JNIEXPORT jint JNICALL
156 Java_sun_management_VMManagementImpl_getPeakThreadCount
157 (JNIEnv *env, jobject dummy)
158 {
159 jlong count = jmm_interface->GetLongAttribute(env, NULL,
160 JMM_THREAD_PEAK_COUNT);
161 return (jint) count;
162 }
163
164 JNIEXPORT jint JNICALL
165 Java_sun_management_VMManagementImpl_getDaemonThreadCount
166 (JNIEnv *env, jobject dummy)
167 {
168 jlong count = jmm_interface->GetLongAttribute(env, NULL,
169 JMM_THREAD_DAEMON_COUNT);
170 return (jint) count;
171 }
172
173 JNIEXPORT jlong JNICALL
174 Java_sun_management_VMManagementImpl_getTotalCompileTime
175 (JNIEnv *env, jobject dummy)
176 {
177 return jmm_interface->GetLongAttribute(env, NULL,
178 JMM_COMPILE_TOTAL_TIME_MS);
179 }
180
181 JNIEXPORT jlong JNICALL
182 Java_sun_management_VMManagementImpl_getStartupTime
183 (JNIEnv *env, jobject dummy)
184 {
185 return jmm_interface->GetLongAttribute(env, NULL,
186 JMM_JVM_INIT_DONE_TIME_MS);
187 }
188
189 JNIEXPORT jlong JNICALL
190 Java_sun_management_VMManagementImpl_getUptime0
191 (JNIEnv *env, jobject dummy)
192 {
193 return jmm_interface->GetLongAttribute(env, NULL, JMM_JVM_UPTIME_MS);
194 }
195
196 JNIEXPORT jboolean JNICALL
197 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled
198 (JNIEnv *env, jobject dummy)
199 {
200 return jmm_interface->GetBoolAttribute(env,
201 JMM_THREAD_CONTENTION_MONITORING);
202 }
203
204 JNIEXPORT jboolean JNICALL
205 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled
206 (JNIEnv *env, jobject dummy)
207 {
208 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME);
209 }
210
211 JNIEXPORT jboolean JNICALL
212 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled
213 (JNIEnv *env, jobject dummy)
214 {
215 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY);
216 }
217
218 JNIEXPORT jint JNICALL
219 Java_sun_management_VMManagementImpl_getProcessId
220 (JNIEnv *env, jobject dummy)
221 {
222 jlong pid = jmm_interface->GetLongAttribute(env, NULL,
223 JMM_OS_PROCESS_ID);
224 return (jint) pid;
225 }
226
227 JNIEXPORT jint JNICALL
228 Java_sun_management_VMManagementImpl_getAvailableProcessors
229 (JNIEnv *env, jobject dummy)
230 {
231 return JVM_ActiveProcessorCount();
232 }
233
234 JNIEXPORT jlong JNICALL
235 Java_sun_management_VMManagementImpl_getSafepointCount
236 (JNIEnv *env, jobject dummy)
237 {
238 return jmm_interface->GetLongAttribute(env, NULL,
239 JMM_SAFEPOINT_COUNT);
240 }
241
242 JNIEXPORT jlong JNICALL
243 Java_sun_management_VMManagementImpl_getTotalSafepointTime
244 (JNIEnv *env, jobject dummy)
245 {
246 return jmm_interface->GetLongAttribute(env, NULL,
247 JMM_TOTAL_STOPPED_TIME_MS);
248 }
249
250 JNIEXPORT jlong JNICALL
251 Java_sun_management_VMManagementImpl_getSafepointSyncTime
252 (JNIEnv *env, jobject dummy)
253 {
254 return jmm_interface->GetLongAttribute(env, NULL,
255 JMM_TOTAL_SAFEPOINTSYNC_TIME_MS);
256 }
257
258 JNIEXPORT jlong JNICALL
259 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime
260 (JNIEnv *env, jobject dummy)
261 {
262 return jmm_interface->GetLongAttribute(env, NULL,
263 JMM_TOTAL_APP_TIME_MS);
264 }
265
266 JNIEXPORT jlong JNICALL
267 Java_sun_management_VMManagementImpl_getLoadedClassSize
268 (JNIEnv *env, jobject dummy)
269 {
270 return jmm_interface->GetLongAttribute(env, NULL,
271 JMM_CLASS_LOADED_BYTES);
272 }
273
274 JNIEXPORT jlong JNICALL
275 Java_sun_management_VMManagementImpl_getUnloadedClassSize
276 (JNIEnv *env, jobject dummy)
277 {
278 return jmm_interface->GetLongAttribute(env, NULL,
279 JMM_CLASS_UNLOADED_BYTES);
280 }
281 JNIEXPORT jlong JNICALL
282 Java_sun_management_VMManagementImpl_getClassLoadingTime
283 (JNIEnv *env, jobject dummy)
284 {
285 return jmm_interface->GetLongAttribute(env, NULL,
286 JMM_TOTAL_CLASSLOAD_TIME_MS);
287 }
288
289
290 JNIEXPORT jlong JNICALL
291 Java_sun_management_VMManagementImpl_getMethodDataSize
292 (JNIEnv *env, jobject dummy)
293 {
294 return jmm_interface->GetLongAttribute(env, NULL,
295 JMM_METHOD_DATA_SIZE_BYTES);
296 }
297
298 JNIEXPORT jlong JNICALL
299 Java_sun_management_VMManagementImpl_getInitializedClassCount
300 (JNIEnv *env, jobject dummy)
301 {
302 return jmm_interface->GetLongAttribute(env, NULL,
303 JMM_CLASS_INIT_TOTAL_COUNT);
304 }
305
306 JNIEXPORT jlong JNICALL
307 Java_sun_management_VMManagementImpl_getClassInitializationTime
308 (JNIEnv *env, jobject dummy)
309 {
310 return jmm_interface->GetLongAttribute(env, NULL,
311 JMM_CLASS_INIT_TOTAL_TIME_MS);
312 }
313
314 JNIEXPORT jlong JNICALL
315 Java_sun_management_VMManagementImpl_getClassVerificationTime
316 (JNIEnv *env, jobject dummy)
317 {
318 return jmm_interface->GetLongAttribute(env, NULL,
319 JMM_CLASS_VERIFY_TOTAL_TIME_MS);
320 }