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