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 jstring JNICALL 105 Java_sun_management_VMManagementImpl_getAOTMode 106 (JNIEnv *env, jobject dummy) 107 { 108 return JVM_AOTGetMode(env); 109 } 110 111 JNIEXPORT jboolean JNICALL 112 Java_sun_management_VMManagementImpl_isAOTRecording 113 (JNIEnv *env, jobject dummy) 114 { 115 return JVM_AOTIsTraining(env); 116 } 117 118 JNIEXPORT jlong JNICALL 119 Java_sun_management_VMManagementImpl_getAOTRecordingDuration 120 (JNIEnv *env, jobject dummy) 121 { 122 return JVM_AOTGetRecordingDuration(env); 123 } 124 125 JNIEXPORT jboolean JNICALL 126 Java_sun_management_VMManagementImpl_endAOTRecording 127 (JNIEnv *env, jobject dummy) 128 { 129 return JVM_AOTEndTraining(env); 130 } 131 132 JNIEXPORT jlong JNICALL 133 Java_sun_management_VMManagementImpl_getTotalClassCount 134 (JNIEnv *env, jobject dummy) 135 { 136 /* JMM_CLASS_LOADED_COUNT is the total number of classes loaded */ 137 jlong count = jmm_interface->GetLongAttribute(env, NULL, 138 JMM_CLASS_LOADED_COUNT); 139 return count; 140 } 141 142 JNIEXPORT jlong JNICALL 143 Java_sun_management_VMManagementImpl_getUnloadedClassCount 144 (JNIEnv *env, jobject dummy) 145 { 146 /* JMM_CLASS_UNLOADED_COUNT is the total number of classes unloaded */ 147 jlong count = jmm_interface->GetLongAttribute(env, NULL, 148 JMM_CLASS_UNLOADED_COUNT); 149 return count; 150 } 151 152 JNIEXPORT jboolean JNICALL 153 Java_sun_management_VMManagementImpl_getVerboseGC 154 (JNIEnv *env, jobject dummy) 155 { 156 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_GC); 157 } 158 159 JNIEXPORT jboolean JNICALL 160 Java_sun_management_VMManagementImpl_getVerboseClass 161 (JNIEnv *env, jobject dummy) 162 { 163 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_CLASS); 164 } 165 166 JNIEXPORT jlong JNICALL 167 Java_sun_management_VMManagementImpl_getTotalThreadCount 168 (JNIEnv *env, jobject dummy) 169 { 170 return jmm_interface->GetLongAttribute(env, NULL, 171 JMM_THREAD_TOTAL_COUNT); 172 } 173 174 JNIEXPORT jint JNICALL 175 Java_sun_management_VMManagementImpl_getLiveThreadCount 176 (JNIEnv *env, jobject dummy) 177 { 178 jlong count = jmm_interface->GetLongAttribute(env, NULL, 179 JMM_THREAD_LIVE_COUNT); 180 return (jint) count; 181 } 182 183 JNIEXPORT jint JNICALL 184 Java_sun_management_VMManagementImpl_getPeakThreadCount 185 (JNIEnv *env, jobject dummy) 186 { 187 jlong count = jmm_interface->GetLongAttribute(env, NULL, 188 JMM_THREAD_PEAK_COUNT); 189 return (jint) count; 190 } 191 192 JNIEXPORT jint JNICALL 193 Java_sun_management_VMManagementImpl_getDaemonThreadCount 194 (JNIEnv *env, jobject dummy) 195 { 196 jlong count = jmm_interface->GetLongAttribute(env, NULL, 197 JMM_THREAD_DAEMON_COUNT); 198 return (jint) count; 199 } 200 201 JNIEXPORT jlong JNICALL 202 Java_sun_management_VMManagementImpl_getTotalCompileTime 203 (JNIEnv *env, jobject dummy) 204 { 205 return jmm_interface->GetLongAttribute(env, NULL, 206 JMM_COMPILE_TOTAL_TIME_MS); 207 } 208 209 JNIEXPORT jlong JNICALL 210 Java_sun_management_VMManagementImpl_getStartupTime 211 (JNIEnv *env, jobject dummy) 212 { 213 return jmm_interface->GetLongAttribute(env, NULL, 214 JMM_JVM_INIT_DONE_TIME_MS); 215 } 216 217 JNIEXPORT jlong JNICALL 218 Java_sun_management_VMManagementImpl_getUptime0 219 (JNIEnv *env, jobject dummy) 220 { 221 return jmm_interface->GetLongAttribute(env, NULL, JMM_JVM_UPTIME_MS); 222 } 223 224 JNIEXPORT jboolean JNICALL 225 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled 226 (JNIEnv *env, jobject dummy) 227 { 228 return jmm_interface->GetBoolAttribute(env, 229 JMM_THREAD_CONTENTION_MONITORING); 230 } 231 232 JNIEXPORT jboolean JNICALL 233 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled 234 (JNIEnv *env, jobject dummy) 235 { 236 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME); 237 } 238 239 JNIEXPORT jboolean JNICALL 240 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled 241 (JNIEnv *env, jobject dummy) 242 { 243 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY); 244 } 245 246 JNIEXPORT jint JNICALL 247 Java_sun_management_VMManagementImpl_getProcessId 248 (JNIEnv *env, jobject dummy) 249 { 250 jlong pid = jmm_interface->GetLongAttribute(env, NULL, 251 JMM_OS_PROCESS_ID); 252 return (jint) pid; 253 } 254 255 JNIEXPORT jint JNICALL 256 Java_sun_management_VMManagementImpl_getAvailableProcessors 257 (JNIEnv *env, jobject dummy) 258 { 259 return JVM_ActiveProcessorCount(); 260 } 261 262 JNIEXPORT jlong JNICALL 263 Java_sun_management_VMManagementImpl_getSafepointCount 264 (JNIEnv *env, jobject dummy) 265 { 266 return jmm_interface->GetLongAttribute(env, NULL, 267 JMM_SAFEPOINT_COUNT); 268 } 269 270 JNIEXPORT jlong JNICALL 271 Java_sun_management_VMManagementImpl_getTotalSafepointTime 272 (JNIEnv *env, jobject dummy) 273 { 274 return jmm_interface->GetLongAttribute(env, NULL, 275 JMM_TOTAL_STOPPED_TIME_MS); 276 } 277 278 JNIEXPORT jlong JNICALL 279 Java_sun_management_VMManagementImpl_getSafepointSyncTime 280 (JNIEnv *env, jobject dummy) 281 { 282 return jmm_interface->GetLongAttribute(env, NULL, 283 JMM_TOTAL_SAFEPOINTSYNC_TIME_MS); 284 } 285 286 JNIEXPORT jlong JNICALL 287 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime 288 (JNIEnv *env, jobject dummy) 289 { 290 return jmm_interface->GetLongAttribute(env, NULL, 291 JMM_TOTAL_APP_TIME_MS); 292 } 293 294 JNIEXPORT jlong JNICALL 295 Java_sun_management_VMManagementImpl_getLoadedClassSize 296 (JNIEnv *env, jobject dummy) 297 { 298 return jmm_interface->GetLongAttribute(env, NULL, 299 JMM_CLASS_LOADED_BYTES); 300 } 301 302 JNIEXPORT jlong JNICALL 303 Java_sun_management_VMManagementImpl_getUnloadedClassSize 304 (JNIEnv *env, jobject dummy) 305 { 306 return jmm_interface->GetLongAttribute(env, NULL, 307 JMM_CLASS_UNLOADED_BYTES); 308 } 309 JNIEXPORT jlong JNICALL 310 Java_sun_management_VMManagementImpl_getClassLoadingTime 311 (JNIEnv *env, jobject dummy) 312 { 313 return jmm_interface->GetLongAttribute(env, NULL, 314 JMM_TOTAL_CLASSLOAD_TIME_MS); 315 } 316 317 318 JNIEXPORT jlong JNICALL 319 Java_sun_management_VMManagementImpl_getMethodDataSize 320 (JNIEnv *env, jobject dummy) 321 { 322 return jmm_interface->GetLongAttribute(env, NULL, 323 JMM_METHOD_DATA_SIZE_BYTES); 324 } 325 326 JNIEXPORT jlong JNICALL 327 Java_sun_management_VMManagementImpl_getInitializedClassCount 328 (JNIEnv *env, jobject dummy) 329 { 330 return jmm_interface->GetLongAttribute(env, NULL, 331 JMM_CLASS_INIT_TOTAL_COUNT); 332 } 333 334 JNIEXPORT jlong JNICALL 335 Java_sun_management_VMManagementImpl_getClassInitializationTime 336 (JNIEnv *env, jobject dummy) 337 { 338 return jmm_interface->GetLongAttribute(env, NULL, 339 JMM_CLASS_INIT_TOTAL_TIME_MS); 340 } 341 342 JNIEXPORT jlong JNICALL 343 Java_sun_management_VMManagementImpl_getClassVerificationTime 344 (JNIEnv *env, jobject dummy) 345 { 346 return jmm_interface->GetLongAttribute(env, NULL, 347 JMM_CLASS_VERIFY_TOTAL_TIME_MS); 348 }