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 }